mercurial/dirstate.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 13 Feb 2023 21:51:45 +0100
changeset 50025 d50d45cd5a5f
parent 50024 0dc2fb4b4b11
child 50026 3550e4a88ccd
permissions -rw-r--r--
dirstate: invalidate the dirstate change on transaction failure If the change context lives inside a transaction, the change are not flushed to disk on exit as this is delegated to the transaction. As a result we should also delegate the part that do cleanup on failure. The issue was caught by tests with other change, but it seems useful to fix this as soon as possible.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     1
# dirstate.py - working directory tracking for mercurial
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46794
diff changeset
     3
# Copyright 2005-2007 Olivia Mackall <olivia@selenic.com>
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     4
#
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
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: 9678
diff changeset
     6
# GNU General Public License version 2 or any later version.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     7
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
     8
27670
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
     9
import collections
32346
73e67c4386ec dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents: 32208
diff changeset
    10
import contextlib
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    11
import os
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    12
import stat
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
    13
import uuid
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    14
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    15
from .i18n import _
43090
1f339b503a40 py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    16
from .pycompat import delattr
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
    17
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
    18
from hgdemandimport import tracing
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
    19
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    20
from . import (
47501
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47489
diff changeset
    21
    dirstatemap,
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    22
    encoding,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    23
    error,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    24
    match as matchmod,
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
    25
    node,
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    26
    pathutil,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
    27
    policy,
30304
ba2c04059317 py3: use pycompat.ossep at certain places
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30224
diff changeset
    28
    pycompat,
27503
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    29
    scmutil,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    30
    util,
0f4596622273 dirstate: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27399
diff changeset
    31
)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    32
48260
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48252
diff changeset
    33
from .dirstateutils import (
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
    34
    docket as docketmod,
48260
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48252
diff changeset
    35
    timestamp,
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48252
diff changeset
    36
)
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48252
diff changeset
    37
42927
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
    38
from .interfaces import (
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
    39
    dirstate as intdirstate,
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
    40
    util as interfaceutil,
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
    41
)
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
    42
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
    43
parsers = policy.importmod('parsers')
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43505
diff changeset
    44
rustmod = policy.importrust('dirstate')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32352
diff changeset
    45
48235
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
    46
HAS_FAST_DIRSTATE_V2 = rustmod is not None
5c567aca080d dirstate-v2: add an option to prevent unintentional slow dirstate-v2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48223
diff changeset
    47
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
    48
propertycache = util.propertycache
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
    49
filecache = scmutil.filecache
47521
abed645b8e96 dirstate: move the handling of special case within the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
    50
_rangemask = dirstatemap.rangemask
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
    51
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48019
diff changeset
    52
DirstateItem = dirstatemap.DirstateItem
21808
7537e57f5dbd dirstate: add dirstatetuple to create dirstate values
Siddharth Agarwal <sid0@fb.com>
parents: 21116
diff changeset
    53
47482
cb29484eaade dirstate: introduce a symbolic constant for the FROM_P2 marker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47481
diff changeset
    54
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
    55
class repocache(filecache):
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
    56
    """filecache for files in .hg/"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
    57
16201
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
    58
    def join(self, obj, fname):
fb7c4c14223f dirstate: filecacheify _branch
Idan Kamara <idankk86@gmail.com>
parents: 16200
diff changeset
    59
        return obj._opener.join(fname)
4610
274c99fc629f dirstate: simplify state()
Matt Mackall <mpm@selenic.com>
parents: 4609
diff changeset
    60
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
    61
16202
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
    62
class rootcache(filecache):
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
    63
    """filecache for files in the repository root"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
    64
16202
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
    65
    def join(self, obj, fname):
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
    66
        return obj._join(fname)
53e2cd303ecf dirstate: filecacheify _ignore (issue3278)
Idan Kamara <idankk86@gmail.com>
parents: 16201
diff changeset
    67
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
    68
49963
23b70ce09e55 dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49962
diff changeset
    69
def requires_changing_parents(func):
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    70
    def wrap(self, *args, **kwargs):
50022
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
    71
        if not self.is_changing_parents:
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
    72
            msg = 'calling `%s` outside of a changing_parents context'
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    73
            msg %= func.__name__
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    74
            raise error.ProgrammingError(msg)
49958
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
    75
        if self._invalidated_context:
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
    76
            msg = 'calling `%s` after the dirstate was invalidated'
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
    77
            raise error.ProgrammingError(msg)
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    78
        return func(self, *args, **kwargs)
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    79
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    80
    return wrap
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    81
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
    82
49964
f979d8af8648 dirstate: rename `@requires_no_parents_change` too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49963
diff changeset
    83
def requires_not_changing_parents(func):
47593
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    84
    def wrap(self, *args, **kwargs):
50022
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
    85
        if self.is_changing_parents:
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
    86
            msg = 'calling `%s` inside of a changing_parents context'
47593
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    87
            msg %= func.__name__
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    88
            raise error.ProgrammingError(msg)
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    89
        return func(self, *args, **kwargs)
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    90
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    91
    return wrap
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    92
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
    93
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
    94
CHANGE_TYPE_PARENTS = "parents"
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
    95
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
    96
42927
d459cd8ea42d interfaces: introduce an interface for dirstate implementations
Augie Fackler <augie@google.com>
parents: 42755
diff changeset
    97
@interfaceutil.implementer(intdirstate.idirstate)
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48922
diff changeset
    98
class dirstate:
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    99
    def __init__(
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   100
        self,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   101
        opener,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   102
        ui,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   103
        root,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   104
        validate,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   105
        sparsematchfn,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   106
        nodeconstants,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   107
        use_dirstate_v2,
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   108
        use_tracked_hint=False,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   109
    ):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   110
        """Create a new dirstate object.
10145
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
   111
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
   112
        opener is an open()-like callable that can be used to open the
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
   113
        dirstate file; root is the root of the directory tracked by
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
   114
        the dirstate.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   115
        """
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   116
        self._use_dirstate_v2 = use_dirstate_v2
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   117
        self._use_tracked_hint = use_tracked_hint
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   118
        self._nodeconstants = nodeconstants
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   119
        self._opener = opener
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 12907
diff changeset
   120
        self._validate = validate
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   121
        self._root = root
49355
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
   122
        # Either build a sparse-matcher or None if sparse is disabled
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   123
        self._sparsematchfn = sparsematchfn
24198
3cc630be5f09 dirstate: make sure rootdir ends with directory separator (issue4557)
Yuya Nishihara <yuya@tcha.org>
parents: 23866
diff changeset
   124
        # ntpath.join(root, '') of Python 2.7.9 does not add sep if root is
3cc630be5f09 dirstate: make sure rootdir ends with directory separator (issue4557)
Yuya Nishihara <yuya@tcha.org>
parents: 23866
diff changeset
   125
        # UNC path pointing to root share (issue4557)
24833
cb981009d697 dirstate: use pathutil.normasprefix to ensure os.sep at the end of root
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24635
diff changeset
   126
        self._rootdir = pathutil.normasprefix(root)
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   127
        # True is any internal state may be different
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
   128
        self._dirty = False
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   129
        # True if the set of tracked file may be different
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   130
        self._dirty_tracked_set = False
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   131
        self._ui = ui
16200
9d4a2942a732 dirstate: add filecache support
Idan Kamara <idankk86@gmail.com>
parents: 16143
diff changeset
   132
        self._filecache = {}
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   133
        # nesting level of `changing_parents` context
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   134
        self._changing_level = 0
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   135
        # the change currently underway
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   136
        self._change_type = None
49958
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   137
        # True if the current dirstate changing operations have been
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   138
        # invalidated (used to make sure all nested contexts have been exited)
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   139
        self._invalidated_context = False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
        self._filename = b'dirstate'
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   141
        self._filename_th = b'dirstate-tracked-hint'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   142
        self._pendingfilename = b'%s.pending' % self._filename
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   143
        self._plchangecallbacks = {}
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   144
        self._origpl = None
47501
8b7e47802deb dirstate: split dirstatemap in its own file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47489
diff changeset
   145
        self._mapcls = dirstatemap.dirstatemap
41674
e178b131906a dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 40424
diff changeset
   146
        # Access and cache cwd early, so we don't access it for the first time
e178b131906a dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 40424
diff changeset
   147
        # after a working-copy update caused it to not exist (accessing it then
e178b131906a dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 40424
diff changeset
   148
        # raises an exception).
e178b131906a dirstate: call and cache os.getcwd() in constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 40424
diff changeset
   149
        self._cwd
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 21984
diff changeset
   150
44826
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   151
    def prefetch_parents(self):
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   152
        """make sure the parents are loaded
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   153
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   154
        Used to avoid a race condition.
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   155
        """
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   156
        self._pl
35b255e474d9 dirstate: make sure the dirstate is loaded before the changelog (issue6303)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44825
diff changeset
   157
32346
73e67c4386ec dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents: 32208
diff changeset
   158
    @contextlib.contextmanager
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   159
    def _changing(self, repo, change_type):
49966
380ed77e9ad3 dirstate: enforce holding the lock while doing any changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49964
diff changeset
   160
        if repo.currentwlock() is None:
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   161
            msg = b"trying to change the dirstate without holding the wlock"
49966
380ed77e9ad3 dirstate: enforce holding the lock while doing any changes
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49964
diff changeset
   162
            raise error.ProgrammingError(msg)
49958
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   163
        if self._invalidated_context:
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   164
            msg = "trying to use an invalidated dirstate before it has reset"
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   165
            raise error.ProgrammingError(msg)
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   166
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   167
        # different type of change are mutually exclusive
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   168
        if self._change_type is None:
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   169
            assert self._changing_level == 0
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   170
            self._change_type = change_type
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   171
        elif self._change_type != change_type:
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   172
            msg = (
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   173
                'trying to open "%s" dirstate-changing context while a "%s" is'
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   174
                ' already open'
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   175
            )
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   176
            msg %= (change_type, self._change_type)
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   177
            raise error.ProgrammingError(msg)
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   178
        self._changing_level += 1
49958
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   179
        try:
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   180
            yield
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   181
        except Exception:
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   182
            self.invalidate()
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   183
            raise
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   184
        finally:
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   185
            if self._changing_level > 0:
49958
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   186
                if self._invalidated_context:
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   187
                    # make sure we invalidate anything an upper context might
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   188
                    # have changed.
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   189
                    self.invalidate()
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   190
                self._changing_level -= 1
49958
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   191
                # The invalidation is complete once we exit the final context
96e526fe5fb0 dirstate: invalidate changes when parent-change fails
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49827
diff changeset
   192
                # manager
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   193
                if self._changing_level <= 0:
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   194
                    self._change_type = None
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   195
                    assert self._changing_level == 0
49962
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   196
                    if self._invalidated_context:
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   197
                        self._invalidated_context = False
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   198
                    else:
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   199
                        # When an exception occured, `_invalidated_context`
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   200
                        # would have been set to True by the `invalidate`
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   201
                        # call earlier.
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   202
                        #
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   203
                        # We don't have more straightforward code, because the
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   204
                        # Exception catching (and the associated `invalidate`
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   205
                        # calling) might have been called by a nested context
5b0beaf45491 dirstate: write dirstate on successful exit of changing_parents context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49961
diff changeset
   206
                        # instead of the top level one.
50025
d50d45cd5a5f dirstate: invalidate the dirstate change on transaction failure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50024
diff changeset
   207
                        tr = repo.currenttransaction()
d50d45cd5a5f dirstate: invalidate the dirstate change on transaction failure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50024
diff changeset
   208
                        if tr is not None:
d50d45cd5a5f dirstate: invalidate the dirstate change on transaction failure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50024
diff changeset
   209
                            abort_cb = lambda tr: self.invalidate()
d50d45cd5a5f dirstate: invalidate the dirstate change on transaction failure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50024
diff changeset
   210
                            tr.addabort(b'dirstate', abort_cb)
d50d45cd5a5f dirstate: invalidate the dirstate change on transaction failure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50024
diff changeset
   211
                        self.write(tr)
32346
73e67c4386ec dirstate: introduce new context manager for marking dirstate parent changes
Augie Fackler <augie@google.com>
parents: 32208
diff changeset
   212
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   213
    @contextlib.contextmanager
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   214
    def changing_parents(self, repo):
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   215
        with self._changing(repo, CHANGE_TYPE_PARENTS) as c:
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   216
            yield c
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   217
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   218
    # here to help migration to the new code
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   219
    def parentchange(self):
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   220
        msg = (
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   221
            "Mercurial 6.4 and later requires call to "
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   222
            "`dirstate.changing_parents(repo)`"
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   223
        )
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   224
        raise error.ProgrammingError(msg)
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   225
50023
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   226
    @property
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   227
    def is_changing_any(self):
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   228
        """Returns true if the dirstate is in the middle of a set of changes.
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   229
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   230
        This returns True for any kind of change.
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   231
        """
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   232
        return self._changing_level > 0
e1cff85484e2 dirstate: introduce a `is_changing_any` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
   233
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 21984
diff changeset
   234
    def pendingparentchange(self):
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   235
        return self.is_changing_parent()
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   236
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   237
    def is_changing_parent(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   238
        """Returns true if the dirstate is in the middle of a set of changes
22404
12bc7f06fc41 dirstate: add begin/endparentchange to dirstate
Durham Goode <durham@fb.com>
parents: 21984
diff changeset
   239
        that modify the dirstate parent.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   240
        """
50022
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   241
        self._ui.deprecwarn(b"dirstate.is_changing_parents", b"6.5")
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   242
        return self.is_changing_parents
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   243
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   244
    @property
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   245
    def is_changing_parents(self):
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   246
        """Returns true if the dirstate is in the middle of a set of changes
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   247
        that modify the dirstate parent.
e333cc169c45 dirstate: rename `pendingparentchange` to `is_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50021
diff changeset
   248
        """
50024
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   249
        if self._changing_level <= 0:
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   250
            return False
0dc2fb4b4b11 dirstate: factor the "changing" context logic out
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50023
diff changeset
   251
        return self._change_type == CHANGE_TYPE_PARENTS
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
   252
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   253
    @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   254
    def _map(self):
35078
a052022639cc dirstate: document dirstatemap interface
Mark Thomas <mbthomas@fb.com>
parents: 35016
diff changeset
   255
        """Return the dirstate contents (see documentation for dirstatemap)."""
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   256
        self._map = self._mapcls(
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   257
            self._ui,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   258
            self._opener,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   259
            self._root,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   260
            self._nodeconstants,
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47277
diff changeset
   261
            self._use_dirstate_v2,
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   262
        )
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   263
        return self._map
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   264
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   265
    @property
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   266
    def _sparsematcher(self):
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   267
        """The matcher for the sparse checkout.
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   268
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   269
        The working directory may not include every file from a manifest. The
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   270
        matcher obtained by this property will match a path if it is to be
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   271
        included in the working directory.
49355
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
   272
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
   273
        When sparse if disabled, return None.
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   274
        """
49355
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
   275
        if self._sparsematchfn is None:
0540c1628fd4 sparse: use None as the sparse matcher value when disabled
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49351
diff changeset
   276
            return None
33373
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   277
        # TODO there is potential to cache this property. For now, the matcher
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   278
        # is resolved on every access. (But the called function does use a
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   279
        # cache to keep the lookup fast.)
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   280
        return self._sparsematchfn()
fb320398a21c dirstate: expose a sparse matcher on dirstate (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33215
diff changeset
   281
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   282
    @repocache(b'branch')
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   283
    def _branch(self):
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   284
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   285
            return self._opener.read(b"branch").strip() or b"default"
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48946
diff changeset
   286
        except FileNotFoundError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   287
            return b"default"
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   288
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
   289
    @property
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   290
    def _pl(self):
34338
0c3e3810cdb6 dirstate: move parent reading to the dirstatemap class
Durham Goode <durham@fb.com>
parents: 34337
diff changeset
   291
        return self._map.parents()
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   292
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
   293
    def hasdir(self, d):
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
   294
        return self._map.hastrackeddir(d)
16143
fceb2964fa6c context: add 'dirs()' to changectx/workingctx for directory patterns
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15801
diff changeset
   295
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   296
    @rootcache(b'.hgignore')
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   297
    def _ignore(self):
27594
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   298
        files = self._ignorefiles()
25216
dc562165044a ignore: use 'include:' rules instead of custom syntax
Durham Goode <durham@fb.com>
parents: 25163
diff changeset
   299
        if not files:
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41674
diff changeset
   300
            return matchmod.never()
25216
dc562165044a ignore: use 'include:' rules instead of custom syntax
Durham Goode <durham@fb.com>
parents: 25163
diff changeset
   301
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   302
        pats = [b'include:%s' % f for f in files]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   303
        return matchmod.match(self._root, b'', [], pats, warn=self._ui.warn)
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   304
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   305
    @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   306
    def _slash(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   307
        return self._ui.configbool(b'ui', b'slash') and pycompat.ossep != b'/'
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   308
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   309
    @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   310
    def _checklink(self):
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   311
        return util.checklink(self._root)
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   312
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   313
    @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   314
    def _checkexec(self):
44801
373dd22ae60e dirstate: force _checkexec to return a bool
Mitchell Plamann <mplamann@janestreet.com>
parents: 44530
diff changeset
   315
        return bool(util.checkexec(self._root))
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   316
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   317
    @propertycache
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   318
    def _checkcase(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
        return not util.fscasesensitive(self._join(b'.hg'))
8261
0fe1f57ac2bd dirstate: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8226
diff changeset
   320
4905
fc61495ea9cf dirstate: make wjoin function private
Matt Mackall <mpm@selenic.com>
parents: 4904
diff changeset
   321
    def _join(self, f):
6972
63d1d3e489f8 performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6971
diff changeset
   322
        # much faster than os.path.join()
6973
8c136043867b dirstate: explain why appending instead of os.path.join() is safe
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6972
diff changeset
   323
        # it's safe because f is always a relative path
6972
63d1d3e489f8 performance: normalize self._root, avoid calling os.path.join() in dirstate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6971
diff changeset
   324
        return self._rootdir + f
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
   325
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 15057
diff changeset
   326
    def flagfunc(self, buildfallback):
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   327
        """build a callable that returns flags associated with a filename
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   328
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   329
        The information is extracted from three possible layers:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   330
        1. the file system if it supports the information
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   331
        2. the "fallback" information stored in the dirstate if any
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   332
        3. a more expensive mechanism inferring the flags from the parents.
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   333
        """
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   334
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   335
        # small hack to cache the result of buildfallback()
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   336
        fallback_func = []
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   337
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   338
        def get_flags(x):
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   339
            entry = None
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   340
            fallback_value = None
48282
0d6a099bba58 dirstate: group return logic and clarify each function in flagfunc
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48281
diff changeset
   341
            try:
0d6a099bba58 dirstate: group return logic and clarify each function in flagfunc
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48281
diff changeset
   342
                st = os.lstat(self._join(x))
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   343
            except OSError:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   344
                return b''
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   345
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   346
            if self._checklink:
48282
0d6a099bba58 dirstate: group return logic and clarify each function in flagfunc
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48281
diff changeset
   347
                if util.statislink(st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   348
                    return b'l'
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   349
            else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   350
                entry = self.get_entry(x)
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   351
                if entry.has_fallback_symlink:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   352
                    if entry.fallback_symlink:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   353
                        return b'l'
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   354
                else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   355
                    if not fallback_func:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   356
                        fallback_func.append(buildfallback())
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   357
                    fallback_value = fallback_func[0](x)
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   358
                    if b'l' in fallback_value:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   359
                        return b'l'
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   360
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   361
            if self._checkexec:
48282
0d6a099bba58 dirstate: group return logic and clarify each function in flagfunc
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48281
diff changeset
   362
                if util.statisexec(st):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
                    return b'x'
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   364
            else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   365
                if entry is None:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   366
                    entry = self.get_entry(x)
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   367
                if entry.has_fallback_exec:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   368
                    if entry.fallback_exec:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   369
                        return b'x'
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   370
                else:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   371
                    if fallback_value is None:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   372
                        if not fallback_func:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   373
                            fallback_func.append(buildfallback())
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   374
                        fallback_value = fallback_func[0](x)
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   375
                    if b'x' in fallback_value:
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   376
                        return b'x'
48282
0d6a099bba58 dirstate: group return logic and clarify each function in flagfunc
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48281
diff changeset
   377
            return b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   378
48290
91f07430db8c dirstate: use a single closure for get_flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48282
diff changeset
   379
        return get_flags
48281
8f54d9c79b12 dirstate: add missing return on platforms without exec or symlink
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48260
diff changeset
   380
20335
e40520642e64 rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20033
diff changeset
   381
    @propertycache
e40520642e64 rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20033
diff changeset
   382
    def _cwd(self):
33215
b7f6885cb055 dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32772
diff changeset
   383
        # internal config: ui.forcecwd
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   384
        forcecwd = self._ui.config(b'ui', b'forcecwd')
33215
b7f6885cb055 dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32772
diff changeset
   385
        if forcecwd:
b7f6885cb055 dirstate: centralize _cwd handling into _cwd method
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32772
diff changeset
   386
            return forcecwd
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39452
diff changeset
   387
        return encoding.getcwd()
20335
e40520642e64 rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20033
diff changeset
   388
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
   389
    def getcwd(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   390
        """Return the path from which a canonical path is calculated.
26293
3d24f31c6b8f dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents: 25877
diff changeset
   391
3d24f31c6b8f dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents: 25877
diff changeset
   392
        This path should be used to resolve file patterns or to convert
3d24f31c6b8f dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents: 25877
diff changeset
   393
        canonical paths back to file paths for display. It shouldn't be
3d24f31c6b8f dirstate: state that getcwd() shouldn't be used to get real file path
Yuya Nishihara <yuya@tcha.org>
parents: 25877
diff changeset
   394
        used to get real file paths. Use vfs functions instead.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   395
        """
20335
e40520642e64 rebase: do not crash in panic when cwd disapear in the process (issue4121)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20033
diff changeset
   396
        cwd = self._cwd
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   397
        if cwd == self._root:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   398
            return b''
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   399
        # self._root ends with a path separator if self._root is '/' or 'C:\'
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   400
        rootsep = self._root
5843
83c354c4d529 Add endswithsep() and use it instead of using os.sep and os.altsep directly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5842
diff changeset
   401
        if not util.endswithsep(rootsep):
30614
cfe66dcf45c0 py3: replace os.sep with pycompat.ossep (part 2 of 4)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30519
diff changeset
   402
            rootsep += pycompat.ossep
4230
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
   403
        if cwd.startswith(rootsep):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   404
            return cwd[len(rootsep) :]
4230
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
   405
        else:
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
   406
            # we're outside the repo. return an absolute path.
c93562fb12cc Fix handling of paths when run outside the repo.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4229
diff changeset
   407
            return cwd
870
a82eae840447 Teach walk code about absolute paths.
Bryan O'Sullivan <bos@serpentine.com>
parents: 839
diff changeset
   408
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
   409
    def pathto(self, f, cwd=None):
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
   410
        if cwd is None:
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
   411
            cwd = self.getcwd()
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   412
        path = util.pathto(self._root, cwd, f)
4527
b422b558015b Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4525
diff changeset
   413
        if self._slash:
19210
865beb849720 dirstate: don't overnormalize for ui.slash
Matt Mackall <mpm@selenic.com>
parents: 19128
diff changeset
   414
            return util.pconvert(path)
4527
b422b558015b Add ui.slash hgrc setting
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4525
diff changeset
   415
        return path
4525
78b6add1f966 Add dirstate.pathto and localrepo.pathto.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4507
diff changeset
   416
48085
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   417
    def get_entry(self, path):
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   418
        """return a DirstateItem for the associated path"""
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   419
        entry = self._map.get(path)
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   420
        if entry is None:
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   421
            return DirstateItem()
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   422
        return entry
6a78715e56c8 dirstate: add a `get_entry` method to the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   423
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
   424
    def __contains__(self, key):
4614
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   425
        return key in self._map
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   426
a8be3c875988 dirstate: hide internal vars
Matt Mackall <mpm@selenic.com>
parents: 4613
diff changeset
   427
    def __iter__(self):
33707
36d216dcae6a dirstate: simplify dirstate's __iter__
Alex Gaynor <agaynor@mozilla.com>
parents: 33440
diff changeset
   428
        return iter(sorted(self._map))
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 217
diff changeset
   429
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32372
diff changeset
   430
    def items(self):
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   431
        return self._map.items()
18792
10669e24eb6c completion: add a debugpathcomplete command
Bryan O'Sullivan <bryano@fb.com>
parents: 18760
diff changeset
   432
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32372
diff changeset
   433
    iteritems = items
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32372
diff changeset
   434
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
   435
    def parents(self):
13032
e41e2b79883d dirstate: warn on invalid parents rather than aborting
Matt Mackall <mpm@selenic.com>
parents: 12907
diff changeset
   436
        return [self._validate(p) for p in self._pl]
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
   437
13876
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
   438
    def p1(self):
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
   439
        return self._validate(self._pl[0])
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
   440
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
   441
    def p2(self):
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
   442
        return self._validate(self._pl[1])
10c7d92ac482 dirstate: add p1/p2 convenience methods
Matt Mackall <mpm@selenic.com>
parents: 13763
diff changeset
   443
47510
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
   444
    @property
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
   445
    def in_merge(self):
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
   446
        """True if a merge is in progress"""
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
   447
        return self._pl[1] != self._nodeconstants.nullid
94c58f3aab56 dirstate: add a `in_merge` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47501
diff changeset
   448
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
   449
    def branch(self):
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 13032
diff changeset
   450
        return encoding.tolocal(self._branch)
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
   451
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
   452
    def setparents(self, p1, p2=None):
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   453
        """Set dirstate parents to p1 and p2.
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   454
47513
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   455
        When moving from two parents to one, "merged" entries a
16551
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   456
        adjusted to normal and previous copy records discarded and
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   457
        returned by the call.
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   458
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   459
        See localrepo.setparents()
ebf6d38c9063 localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents: 16542
diff changeset
   460
        """
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
   461
        if p2 is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
   462
            p2 = self._nodeconstants.nullid
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   463
        if self._changing_level == 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   464
            raise ValueError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   465
                b"cannot set dirstate parent outside of "
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   466
                b"dirstate.changing_parents context manager"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   467
            )
22407
d259322a394b dirstate: add exception when calling setparent without begin/end (API)
Durham Goode <durham@fb.com>
parents: 22404
diff changeset
   468
34339
ec769bba34d3 dirstate: move parents source of truth to dirstatemap
Durham Goode <durham@fb.com>
parents: 34338
diff changeset
   469
        self._dirty = True
16509
eab9119c5dee rebase: skip resolved but emptied revisions
Patrick Mezard <patrick@mezard.eu>
parents: 16472
diff changeset
   470
        oldp2 = self._pl[1]
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   471
        if self._origpl is None:
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   472
            self._origpl = self._pl
47987
dd267f16042f dirstate: make a conditionnal easier to read in `setparents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47986
diff changeset
   473
        nullid = self._nodeconstants.nullid
48059
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48058
diff changeset
   474
        # True if we need to fold p2 related state back to a linear case
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48058
diff changeset
   475
        fold_p2 = oldp2 != nullid and p2 == nullid
5d68c4eedd66 dirstate: move parent state handling in the dirstatemap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48058
diff changeset
   476
        return self._map.setparents(p1, p2, fold_p2=fold_p2)
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 225
diff changeset
   477
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
   478
    def setbranch(self, branch):
40424
7caf632e30c3 filecache: unimplement __set__() and __delete__() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39818
diff changeset
   479
        self.__class__._branch.set(self, encoding.fromlocal(branch))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   480
        f = self._opener(b'branch', b'w', atomictemp=True, checkambig=True)
16472
14a4e17f0817 dirstate: write branch file atomically
Idan Kamara <idankk86@gmail.com>
parents: 16323
diff changeset
   481
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   482
            f.write(self._branch + b'\n')
16472
14a4e17f0817 dirstate: write branch file atomically
Idan Kamara <idankk86@gmail.com>
parents: 16323
diff changeset
   483
            f.close()
18317
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
   484
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
   485
            # make sure filecache has the correct stat info for _branch after
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
   486
            # replacing the underlying file
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   487
            ce = self._filecache[b'_branch']
18317
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
   488
            if ce:
365fecd984c7 dirstate: refresh _branch cache entry after writing it
Idan Kamara <idankk86@gmail.com>
parents: 18078
diff changeset
   489
                ce.refresh()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   490
        except:  # re-raises
18076
3bc21f6daac4 dirstate: don't rename branch file if writing it failed
Idan Kamara <idankk86@gmail.com>
parents: 17984
diff changeset
   491
            f.discard()
3bc21f6daac4 dirstate: don't rename branch file if writing it failed
Idan Kamara <idankk86@gmail.com>
parents: 17984
diff changeset
   492
            raise
4179
7e1c8a565a4f Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents: 4172
diff changeset
   493
4613
3a645af7fb76 localrepo and dirstate: rename reload to invalidate
Matt Mackall <mpm@selenic.com>
parents: 4612
diff changeset
   494
    def invalidate(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   495
        """Causes the next access to reread the dirstate.
32682
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
   496
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
   497
        This is different from localrepo.invalidatedirstate() because it always
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
   498
        rereads the dirstate. Use localrepo.invalidatedirstate() if you want to
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   499
        check whether the dirstate has changed before rereading it."""
32682
e696f597d02f dirstate: add docstring for invalidate
Siddharth Agarwal <sid0@fb.com>
parents: 32605
diff changeset
   500
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43456
diff changeset
   501
        for a in ("_map", "_branch", "_ignore"):
4953
6b3ed43f77ba dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4952
diff changeset
   502
            if a in self.__dict__:
6b3ed43f77ba dirstate.invalidate: avoid rebuilding _map
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4952
diff changeset
   503
                delattr(self, a)
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
   504
        self._dirty = False
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   505
        self._dirty_tracked_set = False
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
   506
        self._invalidated_context = self._changing_level > 0
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   507
        self._origpl = None
4375
109077e7048d When reloading the dirstate, recompute ignore information if needed.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4374
diff changeset
   508
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
   509
    def copy(self, source, dest):
10145
aec936051734 dirstate: improve docstring formatting
Martin Geisler <mg@lazybytes.net>
parents: 9678
diff changeset
   510
        """Mark dest as a copy of source. Unmark dest if source is None."""
6680
deda205a00e1 Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6479
diff changeset
   511
        if source == dest:
deda205a00e1 Ignore dummy copies in dirstate and localrepo.filecommit()
Patrick Mezard <pmezard@gmail.com>
parents: 6479
diff changeset
   512
            return
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
   513
        self._dirty = True
7566
5f7e3f17aece mq: drop copy records when refreshing regular patches (issue1441)
Patrick Mezard <pmezard@gmail.com>
parents: 7280
diff changeset
   514
        if source is not None:
49360
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   515
            self._check_sparse(source)
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
   516
            self._map.copymap[dest] = source
48057
62188e4de549 dirstate: drop the `_updatedfiles` set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48055
diff changeset
   517
        else:
62188e4de549 dirstate: drop the `_updatedfiles` set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48055
diff changeset
   518
            self._map.copymap.pop(dest, None)
363
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
   519
ae96b7e1318d Add hg copy
mpm@selenic.com
parents: 360
diff changeset
   520
    def copied(self, file):
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
   521
        return self._map.copymap.get(file, None)
3154
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
   522
b1f10d3223c1 dirstate: add copies function
Matt Mackall <mpm@selenic.com>
parents: 2962
diff changeset
   523
    def copies(self):
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
   524
        return self._map.copymap
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 514
diff changeset
   525
49964
f979d8af8648 dirstate: rename `@requires_no_parents_change` too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49963
diff changeset
   526
    @requires_not_changing_parents
48384
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   527
    def set_tracked(self, filename, reset_copy=False):
47593
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   528
        """a "public" method for generic code to mark a file as tracked
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   529
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   530
        This function is to be called outside of "update/merge" case. For
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   531
        example by a command like `hg add X`.
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   532
48384
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   533
        if reset_copy is set, any existing copy information will be dropped.
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   534
47593
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   535
        return True the file was previously untracked, False otherwise.
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   536
        """
47984
6255a0d33c45 dirstate: directly call the right function in `set_tracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
   537
        self._dirty = True
47593
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   538
        entry = self._map.get(filename)
47990
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47989
diff changeset
   539
        if entry is None or not entry.tracked:
47984
6255a0d33c45 dirstate: directly call the right function in `set_tracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47983
diff changeset
   540
            self._check_new_tracked_filename(filename)
48384
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   541
        pre_tracked = self._map.set_tracked(filename)
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   542
        if reset_copy:
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   543
            self._map.copymap.pop(filename, None)
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   544
        if pre_tracked:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   545
            self._dirty_tracked_set = True
48384
9f1b9e128788 dirstate: do no use `set_clean` in revert
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48379
diff changeset
   546
        return pre_tracked
47593
f927ad5a4e2c dirstate: add a `set_tracked` method for "hg add"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47592
diff changeset
   547
49964
f979d8af8648 dirstate: rename `@requires_no_parents_change` too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49963
diff changeset
   548
    @requires_not_changing_parents
47599
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   549
    def set_untracked(self, filename):
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   550
        """a "public" method for generic code to mark a file as untracked
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   551
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   552
        This function is to be called outside of "update/merge" case. For
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   553
        example by a command like `hg remove X`.
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   554
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   555
        return True the file was previously tracked, False otherwise.
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   556
        """
47972
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47971
diff changeset
   557
        ret = self._map.set_untracked(filename)
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47971
diff changeset
   558
        if ret:
47861
1c797757f5bb dirstate: directly call the dirstatemap in `set_untracked`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47778
diff changeset
   559
            self._dirty = True
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   560
            self._dirty_tracked_set = True
47972
5a6c1ef4bcac dirstate: make dirstatemap.set_untracked deal with added file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47971
diff changeset
   561
        return ret
47599
cce51119bfe6 dirstate: add a `set_untracked` method for "hg remove"-like usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
   562
49964
f979d8af8648 dirstate: rename `@requires_no_parents_change` too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49963
diff changeset
   563
    @requires_not_changing_parents
48385
080151f18f3a dirstate: make it mandatory to provide parentfiledata in `set_clean`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48384
diff changeset
   564
    def set_clean(self, filename, parentfiledata):
47704
8a50fb0784a9 dirstate: introduce a `set_clean` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47701
diff changeset
   565
        """record that the current state of the file on disk is known to be clean"""
8a50fb0784a9 dirstate: introduce a `set_clean` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47701
diff changeset
   566
        self._dirty = True
47974
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47973
diff changeset
   567
        if not self._map[filename].tracked:
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47973
diff changeset
   568
            self._check_new_tracked_filename(filename)
48385
080151f18f3a dirstate: make it mandatory to provide parentfiledata in `set_clean`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48384
diff changeset
   569
        (mode, size, mtime) = parentfiledata
47974
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47973
diff changeset
   570
        self._map.set_clean(filename, mode, size, mtime)
47704
8a50fb0784a9 dirstate: introduce a `set_clean` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47701
diff changeset
   571
49964
f979d8af8648 dirstate: rename `@requires_no_parents_change` too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49963
diff changeset
   572
    @requires_not_changing_parents
47720
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47719
diff changeset
   573
    def set_possibly_dirty(self, filename):
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47719
diff changeset
   574
        """record that the current state of the file on disk is unknown"""
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47719
diff changeset
   575
        self._dirty = True
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47719
diff changeset
   576
        self._map.set_possibly_dirty(filename)
b0314d8deee1 dirstate: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47719
diff changeset
   577
49963
23b70ce09e55 dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49962
diff changeset
   578
    @requires_changing_parents
47693
46c318b9b9a4 dirstate: rename `update_file_reference` to `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47692
diff changeset
   579
    def update_file_p1(
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   580
        self,
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   581
        filename,
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   582
        p1_tracked,
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   583
    ):
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   584
        """Set a file as tracked in the parent (or not)
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   585
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   586
        This is to be called when adjust the dirstate to a new parent after an history
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   587
        rewriting operation.
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   588
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   589
        It should not be called during a merge (p2 != nullid) and only within
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   590
        a `with dirstate.changing_parents(repo):` context.
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   591
        """
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   592
        if self.in_merge:
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   593
            msg = b'update_file_reference should not be called when merging'
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   594
            raise error.ProgrammingError(msg)
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   595
        entry = self._map.get(filename)
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   596
        if entry is None:
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   597
            wc_tracked = False
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   598
        else:
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   599
            wc_tracked = entry.tracked
48140
98b3eb6c1479 dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
   600
        if not (p1_tracked or wc_tracked):
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   601
            # the file is no longer relevant to anyone
47999
bac82c2ce858 dirstate: use `reset_state` to drop file in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47995
diff changeset
   602
            if self._map.get(filename) is not None:
bac82c2ce858 dirstate: use `reset_state` to drop file in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47995
diff changeset
   603
                self._map.reset_state(filename)
47988
d459c6b84961 dirstate: inline the last two `_drop` usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47987
diff changeset
   604
                self._dirty = True
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   605
        elif (not p1_tracked) and wc_tracked:
47694
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   606
            if entry is not None and entry.added:
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   607
                return  # avoid dropping copy information (maybe?)
47592
0f5c203eb5ab dirstate: add a function to update tracking status while "moving" parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47591
diff changeset
   608
47694
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   609
        self._map.reset_state(
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   610
            filename,
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   611
            wc_tracked,
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   612
            p1_tracked,
48140
98b3eb6c1479 dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
   613
            # the underlying reference might have changed, we will have to
98b3eb6c1479 dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
   614
            # check it.
98b3eb6c1479 dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
   615
            has_meaningful_mtime=False,
47694
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   616
        )
1c06ef8f5ea5 dirstate: use `reset_state` in `update_file_p1`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47693
diff changeset
   617
49963
23b70ce09e55 dirstate: rename `@requires_parents_change` to `@requires_changing_parents`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49962
diff changeset
   618
    @requires_changing_parents
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   619
    def update_file(
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   620
        self,
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   621
        filename,
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   622
        wc_tracked,
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   623
        p1_tracked,
48144
6f54afb094bd dirstate: align the dirstate's API to the lower level ones
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48141
diff changeset
   624
        p2_info=False,
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   625
        possibly_dirty=False,
47691
33beeb32f73a dirstate: replace `update_parent_file_data` with simpler `update_parent` call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47690
diff changeset
   626
        parentfiledata=None,
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   627
    ):
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   628
        """update the information about a file in the dirstate
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   629
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   630
        This is to be called when the direstates parent changes to keep track
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   631
        of what is the file situation in regards to the working copy and its parent.
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   632
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
   633
        This function must be called within a `dirstate.changing_parents` context.
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   634
47771
03089463c554 dirstate: fix typo in docstring
Augie Fackler <augie@google.com>
parents: 47757
diff changeset
   635
        note: the API is at an early stage and we might need to adjust it
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   636
        depending of what information ends up being relevant and useful to
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   637
        other processing.
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   638
        """
50011
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   639
        self._update_file(
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   640
            filename=filename,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   641
            wc_tracked=wc_tracked,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   642
            p1_tracked=p1_tracked,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   643
            p2_info=p2_info,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   644
            possibly_dirty=possibly_dirty,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   645
            parentfiledata=parentfiledata,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   646
        )
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   647
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   648
    def hacky_extension_update_file(self, *args, **kwargs):
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   649
        """NEVER USE THIS, YOU DO NOT NEED IT
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   650
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   651
        This function is a variant of "update_file" to be called by a small set
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   652
        of extensions, it also adjust the internal state of file, but can be
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   653
        called outside an `changing_parents` context.
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   654
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   655
        A very small number of extension meddle with the working copy content
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   656
        in a way that requires to adjust the dirstate accordingly. At the time
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   657
        this command is written they are :
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   658
        - keyword,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   659
        - largefile,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   660
        PLEASE DO NOT GROW THIS LIST ANY FURTHER.
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   661
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   662
        This function could probably be replaced by more semantic one (like
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   663
        "adjust expected size" or "always revalidate file content", etc)
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   664
        however at the time where this is writen, this is too much of a detour
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   665
        to be considered.
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   666
        """
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   667
        self._update_file(
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   668
            *args,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   669
            **kwargs,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   670
        )
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   671
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   672
    def _update_file(
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   673
        self,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   674
        filename,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   675
        wc_tracked,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   676
        p1_tracked,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   677
        p2_info=False,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   678
        possibly_dirty=False,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   679
        parentfiledata=None,
016dc2387943 dirstate: introduce a `hacky_extension_update_file` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50003
diff changeset
   680
    ):
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   681
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   682
        # note: I do not think we need to double check name clash here since we
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   683
        # are in a update/merge case that should already have taken care of
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   684
        # this. The test agrees
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   685
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   686
        self._dirty = True
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   687
        old_entry = self._map.get(filename)
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   688
        if old_entry is None:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   689
            prev_tracked = False
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   690
        else:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   691
            prev_tracked = old_entry.tracked
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   692
        if prev_tracked != wc_tracked:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   693
            self._dirty_tracked_set = True
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   694
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   695
        self._map.reset_state(
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   696
            filename,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   697
            wc_tracked,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   698
            p1_tracked,
48144
6f54afb094bd dirstate: align the dirstate's API to the lower level ones
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48141
diff changeset
   699
            p2_info=p2_info,
48140
98b3eb6c1479 dirstate: align the dirstatemap's API to the data change
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48121
diff changeset
   700
            has_meaningful_mtime=not possibly_dirty,
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   701
            parentfiledata=parentfiledata,
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47691
diff changeset
   702
        )
47611
e2e72daac90b dirstate: add a `update_file` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47599
diff changeset
   703
47973
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   704
    def _check_new_tracked_filename(self, filename):
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   705
        scmutil.checkfilename(filename)
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   706
        if self._map.hastrackeddir(filename):
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   707
            msg = _(b'directory %r already in dirstate')
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   708
            msg %= pycompat.bytestr(filename)
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   709
            raise error.Abort(msg)
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   710
        # shadows
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   711
        for d in pathutil.finddirs(filename):
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   712
            if self._map.hastrackeddir(d):
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   713
                break
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   714
            entry = self._map.get(d)
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   715
            if entry is not None and not entry.removed:
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   716
                msg = _(b'file %r in dirstate clashes with %r')
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   717
                msg %= (pycompat.bytestr(d), pycompat.bytestr(filename))
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   718
                raise error.Abort(msg)
49360
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   719
        self._check_sparse(filename)
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   720
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   721
    def _check_sparse(self, filename):
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   722
        """Check that a filename is inside the sparse profile"""
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   723
        sparsematch = self._sparsematcher
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   724
        if sparsematch is not None and not sparsematch.always():
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   725
            if not sparsematch(filename):
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   726
                msg = _(b"cannot add '%s' - it is outside the sparse checkout")
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   727
                hint = _(
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   728
                    b'include file with `hg debugsparse --include <pattern>` or use '
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   729
                    b'`hg add -s <file>` to include file directory while adding'
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   730
                )
bd3519dc6741 sparse: directly inline the `set_tracked` and `copy` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49357
diff changeset
   731
                raise error.Abort(msg % filename, hint=hint)
47973
2e0ff3947b05 dirstate: extract the logic to check file/dirname collision when adding a file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47972
diff changeset
   732
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   733
    def _discoverpath(self, path, normed, ignoremissing, exists, storemap):
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   734
        if exists is None:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   735
            exists = os.path.lexists(os.path.join(self._root, path))
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   736
        if not exists:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   737
            # Maybe a path component exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   738
            if not ignoremissing and b'/' in path:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   739
                d, f = path.rsplit(b'/', 1)
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   740
                d = self._normalize(d, False, ignoremissing, None)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   741
                folded = d + b"/" + f
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   742
            else:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   743
                # No path components, preserve original case
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   744
                folded = path
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   745
        else:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   746
            # recursively normalize leading directory components
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   747
            # against dirstate
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   748
            if b'/' in normed:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   749
                d, f = normed.rsplit(b'/', 1)
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   750
                d = self._normalize(d, False, ignoremissing, True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   751
                r = self._root + b"/" + d
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   752
                folded = d + b"/" + util.fspath(f, r)
24538
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   753
            else:
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   754
                folded = util.fspath(normed, self._root)
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   755
            storemap[normed] = folded
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   756
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   757
        return folded
24df92075200 dirstate: factor out code to discover normalized path
Siddharth Agarwal <sid0@fb.com>
parents: 24523
diff changeset
   758
24539
3a8eba78803e dirstate: introduce function to normalize just filenames
Siddharth Agarwal <sid0@fb.com>
parents: 24538
diff changeset
   759
    def _normalizefile(self, path, isknown, ignoremissing=False, exists=None):
15488
6eff984d8e76 dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents: 15399
diff changeset
   760
        normed = util.normcase(path)
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
   761
        folded = self._map.filefoldmap.get(normed, None)
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   762
        if folded is None:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   763
            if isknown:
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   764
                folded = path
7068
57377fa7eda2 issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   765
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   766
                folded = self._discoverpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   767
                    path, normed, ignoremissing, exists, self._map.filefoldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   768
                )
24539
3a8eba78803e dirstate: introduce function to normalize just filenames
Siddharth Agarwal <sid0@fb.com>
parents: 24538
diff changeset
   769
        return folded
16302
49b54f1ae053 dirstate: normalize case of directory components
Matt Mackall <mpm@selenic.com>
parents: 16258
diff changeset
   770
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   771
    def _normalize(self, path, isknown, ignoremissing=False, exists=None):
15488
6eff984d8e76 dirstate: fix case-folding identity for traditional Unix
Matt Mackall <mpm@selenic.com>
parents: 15399
diff changeset
   772
        normed = util.normcase(path)
34676
bfddc3d678ae dirstate: remove _filefoldmap property cache
Durham Goode <durham@fb.com>
parents: 34675
diff changeset
   773
        folded = self._map.filefoldmap.get(normed, None)
24561
6514030dc686 dirstate._normalize: don't construct dirfoldmap if not necessary
Siddharth Agarwal <sid0@fb.com>
parents: 24560
diff changeset
   774
        if folded is None:
34678
e8a89ed7ce96 dirstate: move the _dirfoldmap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34677
diff changeset
   775
            folded = self._map.dirfoldmap.get(normed, None)
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   776
        if folded is None:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   777
            if isknown:
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   778
                folded = path
7068
57377fa7eda2 issue 1286: dirstat regression on case folding systems
Petr Kodl <petrkodl@gmail.com>
parents: 7034
diff changeset
   779
            else:
24540
25c1d3ca5ff6 dirstate: split the foldmap into separate ones for files and directories
Siddharth Agarwal <sid0@fb.com>
parents: 24539
diff changeset
   780
                # store discovered result in dirfoldmap so that future
25c1d3ca5ff6 dirstate: split the foldmap into separate ones for files and directories
Siddharth Agarwal <sid0@fb.com>
parents: 24539
diff changeset
   781
                # normalizefile calls don't start matching directories
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   782
                folded = self._discoverpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   783
                    path, normed, ignoremissing, exists, self._map.dirfoldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   784
                )
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   785
        return folded
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   786
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   787
    def normalize(self, path, isknown=False, ignoremissing=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   788
        """
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   789
        normalize the case of a pathname when on a casefolding filesystem
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   790
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   791
        isknown specifies whether the filename came from walking the
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   792
        disk, to avoid extra filesystem access.
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   793
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   794
        If ignoremissing is True, missing path are returned
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   795
        unchanged. Otherwise, we try harder to normalize possibly
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   796
        existing path components.
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   797
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   798
        The normalized case is determined based on the following precedence:
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   799
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   800
        - version of name already stored in the dirstate
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   801
        - version of name stored on disk
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   802
        - version provided via command arguments
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   803
        """
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   804
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   805
        if self._checkcase:
16542
e596a631210e dirstate: preserve path components case on renames (issue3402)
Patrick Mezard <patrick@mezard.eu>
parents: 16509
diff changeset
   806
            return self._normalize(path, isknown, ignoremissing)
13717
bc41d08a5ccc dirstate: introduce a public case normalizing method
Matt Mackall <mpm@selenic.com>
parents: 13400
diff changeset
   807
        return path
6677
9865e15febd0 Add a normalize() method to dirstate
Paul Moore <p.f.moore@gmail.com>
parents: 6675
diff changeset
   808
5065
b304c2496f52 dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4953
diff changeset
   809
    def clear(self):
34933
0217f75b6e59 dirstate: move clear onto dirstatemap class
Durham Goode <durham@fb.com>
parents: 34678
diff changeset
   810
        self._map.clear()
5123
79373ec3f27d merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5045 5065
diff changeset
   811
        self._dirty = True
5065
b304c2496f52 dirstate: fix rebuild; add a test
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4953
diff changeset
   812
18760
e74704c33e24 strip: make --keep option not set all dirstate times to 0
Durham Goode <durham@fb.com>
parents: 18663
diff changeset
   813
    def rebuild(self, parent, allfiles, changedfiles=None):
49357
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   814
        matcher = self._sparsematcher
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   815
        if matcher is not None and not matcher.always():
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   816
            # should not add non-matching files
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   817
            allfiles = [f for f in allfiles if matcher(f)]
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   818
            if changedfiles:
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   819
                changedfiles = [f for f in changedfiles if matcher(f)]
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   820
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   821
            if changedfiles is not None:
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   822
                # these files will be deleted from the dirstate when they are
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   823
                # not found to be in allfiles
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   824
                dirstatefilestoremove = {f for f in self if not matcher(f)}
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   825
                changedfiles = dirstatefilestoremove.union(changedfiles)
5b7a10ddb42f sparse: directly inline the `rebuild` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49356
diff changeset
   826
25448
2bbfc2042d93 dirstate: avoid invalidating every entries when list is empty
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25275
diff changeset
   827
        if changedfiles is None:
27176
54ace3372f84 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents: 27016
diff changeset
   828
            # Rebuild entire dirstate
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   829
            to_lookup = allfiles
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   830
            to_drop = []
27176
54ace3372f84 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents: 27016
diff changeset
   831
            self.clear()
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   832
        elif len(changedfiles) < 10:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   833
            # Avoid turning allfiles into a set, which can be expensive if it's
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   834
            # large.
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   835
            to_lookup = []
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   836
            to_drop = []
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   837
            for f in changedfiles:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   838
                if f in allfiles:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   839
                    to_lookup.append(f)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   840
                else:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   841
                    to_drop.append(f)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   842
        else:
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   843
            changedfilesset = set(changedfiles)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   844
            to_lookup = changedfilesset & set(allfiles)
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   845
            to_drop = changedfilesset - to_lookup
27176
54ace3372f84 dirstate: change debugrebuilddirstate --minimal to use dirstate.rebuild
Christian Delahousse <cdelahousse@fb.com>
parents: 27016
diff changeset
   846
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   847
        if self._origpl is None:
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   848
            self._origpl = self._pl
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
   849
        self._map.setparents(parent, self._nodeconstants.nullid)
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   850
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   851
        for f in to_lookup:
47992
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   852
            if self.in_merge:
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   853
                self.set_tracked(f)
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   854
            else:
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   855
                self._map.reset_state(
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   856
                    f,
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   857
                    wc_tracked=True,
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   858
                    p1_tracked=True,
14fa2e583422 dirstate: replace the use of `_normallookup` in `rebuild`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47991
diff changeset
   859
                )
43891
7eb6a2680ae6 dirstate: when calling rebuild(), avoid some N^2 codepaths
Kyle Lippincott <spectral@google.com>
parents: 43869
diff changeset
   860
        for f in to_drop:
48000
1370d695c258 dirstate: use `reset_state` in `rebuild` instead of `dropfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47999
diff changeset
   861
            self._map.reset_state(f)
30026
ba06562a06a2 dirstate: rebuild should update dirstate properly
Mateusz Kwapich <mitrandir@fb.com>
parents: 29889
diff changeset
   862
4903
81078e177266 dirstate: use True and false for _dirty
Matt Mackall <mpm@selenic.com>
parents: 4677
diff changeset
   863
        self._dirty = True
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
   864
32750
b698921ee137 dirstate: add identity information to detect simultaneous changing in storage
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32682
diff changeset
   865
    def identity(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   866
        """Return identity of dirstate itself to detect changing in storage
32750
b698921ee137 dirstate: add identity information to detect simultaneous changing in storage
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32682
diff changeset
   867
b698921ee137 dirstate: add identity information to detect simultaneous changing in storage
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32682
diff changeset
   868
        If identity of previous dirstate is equal to this, writing
b698921ee137 dirstate: add identity information to detect simultaneous changing in storage
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32682
diff changeset
   869
        changes based on the former dirstate out can keep consistency.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   870
        """
34675
c6ef9a2498a5 dirstate: move identity to dirstatemap
Durham Goode <durham@fb.com>
parents: 34674
diff changeset
   871
        return self._map.identity
32750
b698921ee137 dirstate: add identity information to detect simultaneous changing in storage
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32682
diff changeset
   872
29673
52ff07e1de91 deprecation: enforce thew 'tr' argument of 'dirstate.write' (API)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29351
diff changeset
   873
    def write(self, tr):
4612
17ee7407097f dirstate: simplify dirty handling
Matt Mackall <mpm@selenic.com>
parents: 4611
diff changeset
   874
        if not self._dirty:
1794
98b6c1cad58b only write the dirstate when something changed
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1755
diff changeset
   875
            return
21931
89b809fa6cef dirstate: delay writing out to ensure timestamp of each entries explicitly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21810
diff changeset
   876
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   877
        write_key = self._use_tracked_hint and self._dirty_tracked_set
29673
52ff07e1de91 deprecation: enforce thew 'tr' argument of 'dirstate.write' (API)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29351
diff changeset
   878
        if tr:
26634
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26633
diff changeset
   879
            # delay writing in-memory changes out
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   880
            tr.addfilegenerator(
48683
111f5a0cbcaa dirstate: rename the filegenerator used for writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48682
diff changeset
   881
                b'dirstate-1-main',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   882
                (self._filename,),
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
   883
                lambda f: self._writedirstate(tr, f),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   884
                location=b'plain',
48685
21ac6aedd5e5 transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48684
diff changeset
   885
                post_finalize=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   886
            )
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   887
            if write_key:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   888
                tr.addfilegenerator(
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   889
                    b'dirstate-2-key-post',
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   890
                    (self._filename_th,),
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   891
                    lambda f: self._write_tracked_hint(tr, f),
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   892
                    location=b'plain',
48685
21ac6aedd5e5 transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48684
diff changeset
   893
                    post_finalize=True,
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   894
                )
26634
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26633
diff changeset
   895
            return
09bb1ee7e73e dirstate: make writing in-memory changes aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26633
diff changeset
   896
48682
cdb0d857afe2 dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48531
diff changeset
   897
        file = lambda f: self._opener(f, b"w", atomictemp=True, checkambig=True)
cdb0d857afe2 dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48531
diff changeset
   898
        with file(self._filename) as f:
cdb0d857afe2 dirstate: use a context manager when writing the dirstate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48531
diff changeset
   899
            self._writedirstate(tr, f)
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   900
        if write_key:
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   901
            # we update the key-file after writing to make sure reader have a
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   902
            # key that match the newly written content
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   903
            with file(self._filename_th) as f:
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   904
                self._write_tracked_hint(tr, f)
26521
3f41e28a16d8 dirstate: split write to write changes into files other than .hg/dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26492
diff changeset
   905
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   906
    def delete_tracked_hint(self):
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   907
        """remove the tracked_hint file
48790
5ba24e886cec tracked-key: make it possible to upgrade to and downgrade from the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48685
diff changeset
   908
5ba24e886cec tracked-key: make it possible to upgrade to and downgrade from the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48685
diff changeset
   909
        To be used by format downgrades operation"""
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   910
        self._opener.unlink(self._filename_th)
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   911
        self._use_tracked_hint = False
48790
5ba24e886cec tracked-key: make it possible to upgrade to and downgrade from the feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48685
diff changeset
   912
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   913
    def addparentchangecallback(self, category, callback):
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   914
        """add a callback to be called when the wd parents are changed
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   915
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   916
        Callback will be called with the following arguments:
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   917
            dirstate, (oldp1, oldp2), (newp1, newp2)
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   918
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   919
        Category is a unique identifier to allow overwriting an old callback
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   920
        with a newer callback.
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   921
        """
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   922
        self._plchangecallbacks[category] = callback
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   923
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
   924
    def _writedirstate(self, tr, st):
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   925
        # notify callbacks about parents change
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   926
        if self._origpl is not None and self._origpl != self._pl:
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   927
            for c, callback in sorted(self._plchangecallbacks.items()):
29772
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   928
                callback(self, self._origpl, self._pl)
2ebd507e5ac3 dirstate: add callback to notify extensions about wd parent change
Mateusz Kwapich <mitrandir@fb.com>
parents: 29673
diff changeset
   929
            self._origpl = None
48393
1a8a70b4b0ad dirstate: cleanup remaining of "now" during write
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48392
diff changeset
   930
        self._map.write(tr, st)
34673
e2214632c3a2 dirstate: move write into dirstatemap
Durham Goode <durham@fb.com>
parents: 34672
diff changeset
   931
        self._dirty = False
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   932
        self._dirty_tracked_set = False
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   933
48793
6e559391f96e tracked-key: remove the dual write and rename to tracked-hint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48790
diff changeset
   934
    def _write_tracked_hint(self, tr, f):
48684
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   935
        key = node.hex(uuid.uuid4().bytes)
568f63b5a30f dirstate: introduce a "tracked-key" feature
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48683
diff changeset
   936
        f.write(b"1\n%s\n" % key)  # 1 is the format version
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
   937
6032
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
   938
    def _dirignore(self, f):
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
   939
        if self._ignore(f):
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
   940
            return True
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43620
diff changeset
   941
        for p in pathutil.finddirs(f):
6767
80605a8127e0 dirstate: simplify/optimize path checking
Matt Mackall <mpm@selenic.com>
parents: 6762
diff changeset
   942
            if self._ignore(p):
6032
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
   943
                return True
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
   944
        return False
b41f0d6a74fc dirstate: don't walk ignored directories
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5516
diff changeset
   945
27594
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   946
    def _ignorefiles(self):
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   947
        files = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   948
        if os.path.exists(self._join(b'.hgignore')):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   949
            files.append(self._join(b'.hgignore'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   950
        for name, path in self._ui.configitems(b"ui"):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   951
            if name == b'ignore' or name.startswith(b'ignore.'):
27594
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   952
                # we need to use os.path.join here rather than self._join
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   953
                # because path is arbitrary and user-specified
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   954
                files.append(os.path.join(self._rootdir, util.expandpath(path)))
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   955
        return files
0921caca7703 dirstate: extract logic to compute the list of ignorefiles
Laurent Charignon <lcharignon@fb.com>
parents: 27593
diff changeset
   956
27670
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   957
    def _ignorefileandline(self, f):
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   958
        files = collections.deque(self._ignorefiles())
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   959
        visited = set()
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   960
        while files:
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   961
            i = files.popleft()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   962
            patterns = matchmod.readpatternfile(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   963
                i, self._ui.warn, sourceinfo=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   964
            )
27670
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   965
            for pattern, lineno, line in patterns:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   966
                kind, p = matchmod._patsplit(pattern, b'glob')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   967
                if kind == b"subinclude":
27670
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   968
                    if p not in visited:
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   969
                        files.append(p)
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   970
                    continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   971
                m = matchmod.match(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   972
                    self._root, b'', [], [pattern], warn=self._ui.warn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
   973
                )
27670
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   974
                if m(f):
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   975
                    return (i, lineno, line)
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   976
            visited.add(i)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   977
        return (None, -1, b"")
27670
4374f039d269 dirstate: add a way to get the ignore file/line matching an ignored file
Laurent Charignon <lcharignon@fb.com>
parents: 27594
diff changeset
   978
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
   979
    def _walkexplicit(self, match, subrepos):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   980
        """Get stat data about the files explicitly specified by match.
3529
09d99b7e4da0 simplify dirstate walking
Matt Mackall <mpm@selenic.com>
parents: 3223
diff changeset
   981
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
   982
        Return a triple (results, dirsfound, dirsnotfound).
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
   983
        - results is a mapping from filename to stat result. It also contains
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
   984
          listings mapping subrepos and .hg to None.
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
   985
        - dirsfound is a list of files found to be directories.
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
   986
        - dirsnotfound is a list of files that the dirstate thinks are
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
   987
          directories and that were not found."""
6578
f242d3684f83 walk: begin refactoring badmatch handling
Matt Mackall <mpm@selenic.com>
parents: 6577
diff changeset
   988
8681
26f133267cd7 walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
   989
        def badtype(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   990
            kind = _(b'unknown')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   991
            if stat.S_ISCHR(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   992
                kind = _(b'character device')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   993
            elif stat.S_ISBLK(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   994
                kind = _(b'block device')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   995
            elif stat.S_ISFIFO(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   996
                kind = _(b'fifo')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   997
            elif stat.S_ISSOCK(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   998
                kind = _(b'socket')
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   999
            elif stat.S_ISDIR(mode):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1000
                kind = _(b'directory')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1001
            return _(b'unsupported file type (type is %s)') % kind
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1002
8676
acd69fc201a5 walk: we always have a badfn
Matt Mackall <mpm@selenic.com>
parents: 8675
diff changeset
  1003
        badfn = match.bad
6831
2b663f542bd3 dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 6830
diff changeset
  1004
        dmap = self._map
5000
46facb73ba8b dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents: 4965
diff changeset
  1005
        lstat = os.lstat
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1006
        getkind = stat.S_IFMT
6828
55d65a33da52 dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 6827
diff changeset
  1007
        dirkind = stat.S_IFDIR
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1008
        regkind = stat.S_IFREG
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1009
        lnkkind = stat.S_IFLNK
6831
2b663f542bd3 dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 6830
diff changeset
  1010
        join = self._join
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
  1011
        dirsfound = []
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
  1012
        foundadd = dirsfound.append
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1013
        dirsnotfound = []
19175
63f7bd2e1a46 dirstate._walkexplicit: inline dirsnotfound.append
Siddharth Agarwal <sid0@fb.com>
parents: 19174
diff changeset
  1014
        notfoundadd = dirsnotfound.append
6820
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
  1015
24448
55c449345b10 match: add isexact() method to hide internals
Martin von Zweigbergk <martinvonz@google.com>
parents: 24212
diff changeset
  1016
        if not match.isexact() and self._checkcase:
12907
e255a5dc29e6 dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
  1017
            normalize = self._normalize
e255a5dc29e6 dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
  1018
        else:
18032
a9e623bb440e dirstate: test normalize is truthy instead of using a no-op lambda
Siddharth Agarwal <sid0@fb.com>
parents: 18018
diff changeset
  1019
            normalize = None
12907
e255a5dc29e6 dirstate: skip optimization on case-folding FS (issue2440)
Matt Mackall <mpm@selenic.com>
parents: 12401
diff changeset
  1020
12211
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1021
        files = sorted(match.files())
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1022
        subrepos.sort()
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1023
        i, j = 0, 0
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1024
        while i < len(files) and j < len(subrepos):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1025
            subpath = subrepos[j] + b"/"
13233
0b30e6148ec5 subrepo: do not report known files inside repositories as unknown
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents: 12907
diff changeset
  1026
            if files[i] < subpath:
12211
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1027
                i += 1
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1028
                continue
13339
22167be007ed subrepo: fix pruning of subrepo filenames in dirstate (issue2619)
trbs <trbs@trbs.net>
parents: 13233
diff changeset
  1029
            while i < len(files) and files[i].startswith(subpath):
12211
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1030
                del files[i]
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1031
            j += 1
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1032
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1033
        if not files or b'' in files:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1034
            files = [b'']
42340
7ada598941d2 dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents: 42304
diff changeset
  1035
            # constructing the foldmap is expensive, so don't do it for the
42341
27d6956d386b match: use '' instead of '.' for root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42340
diff changeset
  1036
            # common case where files is ['']
42340
7ada598941d2 dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents: 42304
diff changeset
  1037
            normalize = None
10176
24ce8f0c0a39 dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents: 10145
diff changeset
  1038
        results = dict.fromkeys(subrepos)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1039
        results[b'.hg'] = None
5000
46facb73ba8b dirstate: localize a bunch of methods for findfiles
Matt Mackall <mpm@selenic.com>
parents: 4965
diff changeset
  1040
12211
798d72f3621c dirstate: use one pass to filter out files in subrepos
Martin Geisler <mg@lazybytes.net>
parents: 12164
diff changeset
  1041
        for ff in files:
42340
7ada598941d2 dirstate: move special handling of files==['.'] together
Martin von Zweigbergk <martinvonz@google.com>
parents: 42304
diff changeset
  1042
            if normalize:
24522
18085e46caa9 dirstate._walkexplicit: drop normpath calls
Siddharth Agarwal <sid0@fb.com>
parents: 24521
diff changeset
  1043
                nf = normalize(ff, False, True)
18032
a9e623bb440e dirstate: test normalize is truthy instead of using a no-op lambda
Siddharth Agarwal <sid0@fb.com>
parents: 18018
diff changeset
  1044
            else:
24522
18085e46caa9 dirstate._walkexplicit: drop normpath calls
Siddharth Agarwal <sid0@fb.com>
parents: 24521
diff changeset
  1045
                nf = ff
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
  1046
            if nf in results:
6820
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
  1047
                continue
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
  1048
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
  1049
            try:
6831
2b663f542bd3 dirstate.walk: more cleanups
Matt Mackall <mpm@selenic.com>
parents: 6830
diff changeset
  1050
                st = lstat(join(nf))
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1051
                kind = getkind(st.st_mode)
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1052
                if kind == dirkind:
8588
2624f485b9bc dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents: 8521
diff changeset
  1053
                    if nf in dmap:
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1054
                        # file replaced by dir on disk but still in dirstate
8588
2624f485b9bc dirstate: set more states in step 1 of walk
Simon Heimberg <simohe@besonet.ch>
parents: 8521
diff changeset
  1055
                        results[nf] = None
24537
2bb13f2b778c dirstate: don't require exact case when adding dirs on icasefs (issue4578)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24198
diff changeset
  1056
                    foundadd((nf, ff))
12401
4cdaf1adafc8 backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents: 12387
diff changeset
  1057
                elif kind == regkind or kind == lnkkind:
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1058
                    results[nf] = st
6828
55d65a33da52 dirstate.walk: minor cleanups
Matt Mackall <mpm@selenic.com>
parents: 6827
diff changeset
  1059
                else:
8681
26f133267cd7 walk: use match.bad callback for filetype messages
Matt Mackall <mpm@selenic.com>
parents: 8680
diff changeset
  1060
                    badfn(ff, badtype(kind))
6830
2cf4cda64727 dirstate.walk: fold in _supported
Matt Mackall <mpm@selenic.com>
parents: 6829
diff changeset
  1061
                    if nf in dmap:
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
  1062
                        results[nf] = None
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
  1063
            except (OSError) as inst:
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
  1064
                # nf not found on disk - it is dirstate only
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1065
                if nf in dmap:  # does it exactly match a missing file?
8675
fb74e1e69da0 walk: simplify check for missing file
Matt Mackall <mpm@selenic.com>
parents: 8645
diff changeset
  1066
                    results[nf] = None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1067
                else:  # does it match a missing directory?
35084
61888bd0b300 dirstate: add explicit methods for querying directories (API)
Mark Thomas <mbthomas@fb.com>
parents: 35083
diff changeset
  1068
                    if self._map.hasdir(nf):
23375
a179db3db9b9 dirstate: speed up repeated missing directory checks
Martin von Zweigbergk <martinvonz@google.com>
parents: 22915
diff changeset
  1069
                        notfoundadd(nf)
8677
34df078b8b1b walk: simplify logic for badfn clause
Matt Mackall <mpm@selenic.com>
parents: 8676
diff changeset
  1070
                    else:
34022
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 33981
diff changeset
  1071
                        badfn(ff, encoding.strtolocal(inst.strerror))
6820
639d9cb95509 dirstate.walk: fold findfiles into main walk loop
Matt Mackall <mpm@selenic.com>
parents: 6819
diff changeset
  1072
36200
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1073
        # match.files() may contain explicitly-specified paths that shouldn't
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1074
        # be taken; drop them from the list of files found. dirsfound/notfound
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1075
        # aren't filtered here because they will be tested later.
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1076
        if match.anypats():
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1077
            for f in list(results):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1078
                if f == b'.hg' or f in subrepos:
36200
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1079
                    # keep sentinel to disable further out-of-repo walks
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1080
                    continue
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1081
                if not match(f):
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1082
                    del results[f]
deb851914fd7 dirstate: drop explicit files that shouldn't match (BC) (issue4679)
Yuya Nishihara <yuya@tcha.org>
parents: 35895
diff changeset
  1083
25877
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1084
        # Case insensitive filesystems cannot rely on lstat() failing to detect
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1085
        # a case-only rename.  Prune the stat object for any file that does not
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1086
        # match the case in the filesystem, if there are multiple files that
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1087
        # normalize to the same path.
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1088
        if match.isexact() and self._checkcase:
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1089
            normed = {}
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1090
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1091
            for f, st in results.items():
25877
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1092
                if st is None:
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1093
                    continue
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1094
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1095
                nc = util.normcase(f)
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1096
                paths = normed.get(nc)
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1097
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1098
                if paths is None:
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1099
                    paths = set()
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1100
                    normed[nc] = paths
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1101
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1102
                paths.add(f)
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1103
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
  1104
            for norm, paths in normed.items():
25877
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1105
                if len(paths) > 1:
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1106
                    for path in paths:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1107
                        folded = self._discoverpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1108
                            path, norm, True, None, self._map.dirfoldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1109
                        )
25877
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1110
                        if path != folded:
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1111
                            results[path] = None
85785cd3b69f dirstate: ensure mv source is marked deleted when walking icasefs (issue4760)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1112
19174
022256ef47b8 dirstate._walkexplicit: rename work to dirsfound
Siddharth Agarwal <sid0@fb.com>
parents: 19173
diff changeset
  1113
        return results, dirsfound, dirsnotfound
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1114
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1115
    def walk(self, match, subrepos, unknown, ignored, full=True):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
  1116
        """
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1117
        Walk recursively through the directory tree, finding all files
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1118
        matched by match.
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1119
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1120
        If full is False, maybe skip some known-clean files.
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1121
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1122
        Return a dict mapping filename to stat-like object (either
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1123
        mercurial.osutil.stat instance or return value of os.stat()).
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1124
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
  1125
        """
19190
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1126
        # full is a flag that extensions that hook into walk can use -- this
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1127
        # implementation doesn't use it at all. This satisfies the contract
b03952ee634d dirstate.walk: add a flag to let extensions avoid full walks
Siddharth Agarwal <sid0@fb.com>
parents: 19175
diff changeset
  1128
        # because we only guarantee a "maybe".
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1129
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1130
        if ignored:
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1131
            ignore = util.never
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1132
            dirignore = util.never
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1133
        elif unknown:
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1134
            ignore = self._ignore
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1135
            dirignore = self._dirignore
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1136
        else:
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1137
            # if not unknown and not ignored, drop dir recursion and step 2
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1138
            ignore = util.always
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1139
            dirignore = util.always
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1140
49356
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  1141
        if self._sparsematchfn is not None:
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  1142
            em = matchmod.exact(match.files())
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  1143
            sm = matchmod.unionmatcher([self._sparsematcher, em])
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  1144
            match = matchmod.intersectmatchers(match, sm)
a87443d4aec0 sparse: directly inline the `walk` wrapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49355
diff changeset
  1145
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1146
        matchfn = match.matchfn
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1147
        matchalways = match.always()
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1148
        matchtdir = match.traversedir
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1149
        dmap = self._map
32208
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32177
diff changeset
  1150
        listdir = util.listdir
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1151
        lstat = os.lstat
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1152
        dirkind = stat.S_IFDIR
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1153
        regkind = stat.S_IFREG
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1154
        lnkkind = stat.S_IFLNK
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1155
        join = self._join
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1156
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1157
        exact = skipstep3 = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1158
        if match.isexact():  # match.exact
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1159
            exact = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1160
            dirignore = util.always  # skip step 2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1161
        elif match.prefix():  # match.match, no patterns
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1162
            skipstep3 = True
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1163
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1164
        if not exact and self._checkcase:
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1165
            normalize = self._normalize
24541
e235b5dc5cf9 dirstate.walk: use the file foldmap to normalize
Siddharth Agarwal <sid0@fb.com>
parents: 24540
diff changeset
  1166
            normalizefile = self._normalizefile
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1167
            skipstep3 = False
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1168
        else:
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1169
            normalize = self._normalize
24541
e235b5dc5cf9 dirstate.walk: use the file foldmap to normalize
Siddharth Agarwal <sid0@fb.com>
parents: 24540
diff changeset
  1170
            normalizefile = None
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1171
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1172
        # step 1: find all explicit files
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1173
        results, work, dirsnotfound = self._walkexplicit(match, subrepos)
43713
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
  1174
        if matchtdir:
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
  1175
            for d in work:
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
  1176
                matchtdir(d[0])
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
  1177
            for d in dirsnotfound:
95d2eab0a7b9 dirstate: include explicit matches in match.traversedir calls
Martin von Zweigbergk <martinvonz@google.com>
parents: 43696
diff changeset
  1178
                matchtdir(d)
19173
ec70a78a70e0 dirstate.walk: refactor explicit walk into separate function
Siddharth Agarwal <sid0@fb.com>
parents: 19172
diff changeset
  1179
19172
c6cea2e2031b dirstate.walk: pull skipstep3 out of the explicit walk code
Siddharth Agarwal <sid0@fb.com>
parents: 19171
diff changeset
  1180
        skipstep3 = skipstep3 and not (work or dirsnotfound)
24537
2bb13f2b778c dirstate: don't require exact case when adding dirs on icasefs (issue4578)
Matt Harbison <matt_harbison@yahoo.com>
parents: 24198
diff changeset
  1181
        work = [d for d in work if not dirignore(d[0])]
19171
252de7b77cfd dirstate.walk: move dirignore filter out of explicit walk code
Siddharth Agarwal <sid0@fb.com>
parents: 19170
diff changeset
  1182
6826
eca20fee0728 dirstate.walk: pull directory scanning into top-level loop
Matt Mackall <mpm@selenic.com>
parents: 6825
diff changeset
  1183
        # step 2: visit subdirectories
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1184
        def traverse(work, alreadynormed):
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1185
            wadd = work.append
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1186
            while work:
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  1187
                tracing.counter('dirstate.walk work', len(work))
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1188
                nd = work.pop()
38956
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
  1189
                visitentries = match.visitchildrenset(nd)
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
  1190
                if not visitentries:
32177
8f1a2b848b52 dirstate: optimize walk() by using match.visitdir()
Martin von Zweigbergk <martinvonz@google.com>
parents: 31547
diff changeset
  1191
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1192
                if visitentries == b'this' or visitentries == b'all':
38956
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
  1193
                    visitentries = None
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1194
                skip = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1195
                if nd != b'':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1196
                    skip = b'.hg'
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1197
                try:
43239
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  1198
                    with tracing.log('dirstate.walk.traverse listdir %s', nd):
6fcdcea2b03a dirstate: add some traces on listdir calls
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
  1199
                        entries = listdir(join(nd), stat=True, skip=skip)
49310
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
  1200
                except (PermissionError, FileNotFoundError) as inst:
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
  1201
                    match.bad(
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
  1202
                        self.pathto(nd), encoding.strtolocal(inst.strerror)
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
  1203
                    )
050dc8730858 py3: catch specific OSError subclasses instead of checking errno
Manuel Jacob <me@manueljacob.de>
parents: 49306
diff changeset
  1204
                    continue
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1205
                for f, kind, st in entries:
39260
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1206
                    # Some matchers may return files in the visitentries set,
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1207
                    # instead of 'this', if the matcher explicitly mentions them
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1208
                    # and is not an exactmatcher. This is acceptable; we do not
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1209
                    # make any hard assumptions about file-or-directory below
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1210
                    # based on the presence of `f` in visitentries. If
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1211
                    # visitchildrenset returned a set, we can always skip the
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1212
                    # entries *not* in the set it provided regardless of whether
27946fca8a05 match: document that visitchildrenset might return files
Kyle Lippincott <spectral@google.com>
parents: 38959
diff changeset
  1213
                    # they're actually a file or a directory.
38956
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
  1214
                    if visitentries and f not in visitentries:
a3cabe9415e1 dirstate: use visitchildrenset in traverse
Kyle Lippincott <spectral@google.com>
parents: 36995
diff changeset
  1215
                        continue
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1216
                    if normalizefile:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1217
                        # even though f might be a directory, we're only
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1218
                        # interested in comparing it to files currently in the
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1219
                        # dmap -- therefore normalizefile is enough
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1220
                        nf = normalizefile(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1221
                            nd and (nd + b"/" + f) or f, True, True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1222
                        )
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1223
                    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1224
                        nf = nd and (nd + b"/" + f) or f
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1225
                    if nf not in results:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1226
                        if kind == dirkind:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1227
                            if not ignore(nf):
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1228
                                if matchtdir:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1229
                                    matchtdir(nf)
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1230
                                wadd(nf)
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1231
                            if nf in dmap and (matchalways or matchfn(nf)):
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1232
                                results[nf] = None
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1233
                        elif kind == regkind or kind == lnkkind:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1234
                            if nf in dmap:
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1235
                                if matchalways or matchfn(nf):
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1236
                                    results[nf] = st
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1237
                            elif (matchalways or matchfn(nf)) and not ignore(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1238
                                nf
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1239
                            ):
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1240
                                # unknown file -- normalize if necessary
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1241
                                if not alreadynormed:
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1242
                                    nf = normalize(nf, False, True)
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1243
                                results[nf] = st
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1244
                        elif nf in dmap and (matchalways or matchfn(nf)):
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
  1245
                            results[nf] = None
24559
4728d6f7c69f dirstate.walk: factor out directory traversal
Siddharth Agarwal <sid0@fb.com>
parents: 24553
diff changeset
  1246
24560
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1247
        for nd, d in work:
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1248
            # alreadynormed means that processwork doesn't have to do any
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1249
            # expensive directory normalization
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1250
            alreadynormed = not normalize or nd == d
b38bcf18993c dirstate.walk: don't keep track of normalized files in parallel
Siddharth Agarwal <sid0@fb.com>
parents: 24559
diff changeset
  1251
            traverse([d], alreadynormed)
536
c15b4bc0a11c Refactor diffrevs/diffdir into changes
mpm@selenic.com
parents: 529
diff changeset
  1252
18812
1c40526da52a dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18792
diff changeset
  1253
        for s in subrepos:
1c40526da52a dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18792
diff changeset
  1254
            del results[s]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1255
        del results[b'.hg']
18812
1c40526da52a dirstate.walk: remove subrepo and .hg from results before step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18792
diff changeset
  1256
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1257
        # step 3: visit remaining files from dmap
8684
5bb7780b57c7 match: fold plan cases down to two special cases
Matt Mackall <mpm@selenic.com>
parents: 8683
diff changeset
  1258
        if not skipstep3 and not exact:
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1259
            # If a dmap file is not in results yet, it was either
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1260
            # a) not matching matchfn b) ignored, c) missing, or d) under a
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1261
            # symlink directory.
18815
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
  1262
            if not results and matchalways:
31422
2e38a88bbc6c dirstate: use list comprehension to get a list of keys
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31278
diff changeset
  1263
                visit = [f for f in dmap]
18815
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
  1264
            else:
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
  1265
                visit = [f for f in dmap if f not in results and matchfn(f)]
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
  1266
            visit.sort()
a18919de61e5 dirstate.walk: fast path none-seen + match-always case for step 3
Siddharth Agarwal <sid0@fb.com>
parents: 18814
diff changeset
  1267
18625
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1268
            if unknown:
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1269
                # unknown == True means we walked all dirs under the roots
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1270
                # that wasn't ignored, and everything that matched was stat'ed
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1271
                # and is already in results.
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1272
                # The rest must thus be ignored or under a symlink.
33649
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33440
diff changeset
  1273
                audit_path = pathutil.pathauditor(self._root, cached=True)
18625
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1274
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1275
                for nf in iter(visit):
24621
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
  1276
                    # If a stat for the same file was already added with a
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
  1277
                    # different case, don't add one for this, since that would
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
  1278
                    # make it appear as if the file exists under both names
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
  1279
                    # on disk.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1280
                    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1281
                        normalizefile
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1282
                        and normalizefile(nf, True, True) in results
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1283
                    ):
24621
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
  1284
                        results[nf] = None
18625
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1285
                    # Report ignored items in the dmap as long as they are not
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1286
                    # under a symlink directory.
24621
1784ca148392 dirstate.walk: don't report same file stat multiple times
Martin von Zweigbergk <martinvonz@google.com>
parents: 24537
diff changeset
  1287
                    elif audit_path.check(nf):
18663
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
  1288
                        try:
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
  1289
                            results[nf] = lstat(join(nf))
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1290
                            # file was just ignored, no links, and exists
18663
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
  1291
                        except OSError:
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
  1292
                            # file doesn't exist
05cf40f9b0ec dirstate: fix generator/list error when using python 2.7
Durham Goode <durham@fb.com>
parents: 18653
diff changeset
  1293
                            results[nf] = None
18625
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1294
                    else:
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1295
                        # It's either missing or under a symlink directory
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1296
                        # which we in this case report as missing
18625
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1297
                        results[nf] = None
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1298
            else:
2cbd27f4f3c4 dirstate: walk returns None for files that have a symlink in their path
Durham Goode <durham@fb.com>
parents: 18567
diff changeset
  1299
                # We may not have walked the full directory tree above,
21115
1b6e37f44250 dirstate: improve documentation and readability of match and ignore in the walker
Mads Kiilerich <madski@unity3d.com>
parents: 21026
diff changeset
  1300
                # so stat and check everything we missed.
31507
4d1dd9cf0dca dirstate: use future-proof next(iter) instead of iter.next
Augie Fackler <augie@google.com>
parents: 31422
diff changeset
  1301
                iv = iter(visit)
26984
af2663680e95 dirstate: back out 502b56a9e897
Bryan O'Sullivan <bos@serpentine.com>
parents: 26887
diff changeset
  1302
                for st in util.statfiles([join(i) for i in visit]):
31507
4d1dd9cf0dca dirstate: use future-proof next(iter) instead of iter.next
Augie Fackler <augie@google.com>
parents: 31422
diff changeset
  1303
                    results[next(iv)] = st
6829
fec1da46006e dirstate.walk: build a dict rather than yield
Matt Mackall <mpm@selenic.com>
parents: 6828
diff changeset
  1304
        return results
669
8aa2a282eda4 .hgignore speedups patch incorporating Matt's feedback.
mwilli2@localhost.localdomain
parents: 667
diff changeset
  1305
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1306
    def _rust_status(self, matcher, list_clean, list_ignored, list_unknown):
49361
c2092612c424 sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49360
diff changeset
  1307
        if self._sparsematchfn is not None:
c2092612c424 sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49360
diff changeset
  1308
            em = matchmod.exact(matcher.files())
c2092612c424 sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49360
diff changeset
  1309
            sm = matchmod.unionmatcher([self._sparsematcher, em])
c2092612c424 sparse: use the rust code even when sparse is present
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49360
diff changeset
  1310
            matcher = matchmod.intersectmatchers(matcher, sm)
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1311
        # Force Rayon (Rust parallelism library) to respect the number of
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1312
        # workers. This is a temporary workaround until Rust code knows
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1313
        # how to read the config file.
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1314
        numcpus = self._ui.configint(b"worker", b"numcpus")
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1315
        if numcpus is not None:
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1316
            encoding.environ.setdefault(b'RAYON_NUM_THREADS', b'%d' % numcpus)
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1317
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1318
        workers_enabled = self._ui.configbool(b"worker", b"enabled", True)
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1319
        if not workers_enabled:
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1320
            encoding.environ[b"RAYON_NUM_THREADS"] = b"1"
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1321
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1322
        (
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1323
            lookup,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1324
            modified,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1325
            added,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1326
            removed,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1327
            deleted,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1328
            clean,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1329
            ignored,
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1330
            unknown,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1331
            warnings,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1332
            bad,
44840
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1333
            traversed,
47350
04d1f17f49e7 dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47320
diff changeset
  1334
            dirty,
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1335
        ) = rustmod.status(
48121
5fc2dfb073d6 dirstatemap: rename `_rustmap` to `_map`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48107
diff changeset
  1336
            self._map._map,
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1337
            matcher,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1338
            self._rootdir,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1339
            self._ignorefiles(),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1340
            self._checkexec,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1341
            bool(list_clean),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1342
            bool(list_ignored),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1343
            bool(list_unknown),
44840
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1344
            bool(matcher.traversedir),
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1345
        )
44840
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1346
47350
04d1f17f49e7 dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47320
diff changeset
  1347
        self._dirty |= dirty
04d1f17f49e7 dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47320
diff changeset
  1348
44840
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1349
        if matcher.traversedir:
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1350
            for dir in traversed:
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1351
                matcher.traversedir(dir)
4ba2a6ffcf24 status: also support for `traversedir` callback in the Rust fast-path
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44836
diff changeset
  1352
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1353
        if self._ui.warn:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1354
            for item in warnings:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1355
                if isinstance(item, tuple):
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1356
                    file_path, syntax = item
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1357
                    msg = _(b"%s: ignoring invalid syntax '%s'\n") % (
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1358
                        file_path,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1359
                        syntax,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1360
                    )
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1361
                    self._ui.warn(msg)
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1362
                else:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1363
                    msg = _(b"skipping unreadable pattern file '%s': %s\n")
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1364
                    self._ui.warn(
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1365
                        msg
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1366
                        % (
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1367
                            pathutil.canonpath(
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1368
                                self._rootdir, self._rootdir, item
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1369
                            ),
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1370
                            b"No such file or directory",
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1371
                        )
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1372
                    )
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1373
50021
4e955a7a6a55 dirstate: rename _parentwriters to _changing_level
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50011
diff changeset
  1374
        for fn, message in bad:
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1375
            matcher.bad(fn, encoding.strtolocal(message))
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1376
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1377
        status = scmutil.status(
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1378
            modified=modified,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1379
            added=added,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1380
            removed=removed,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1381
            deleted=deleted,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1382
            unknown=unknown,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1383
            ignored=ignored,
44078
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1384
            clean=clean,
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1385
        )
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1386
        return (lookup, status)
f2c350e7371e dirstate: move rust fast-path calling code to its own method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43917
diff changeset
  1387
10176
24ce8f0c0a39 dirstate: don't check state of subrepo directories
Augie Fackler <durin42@gmail.com>
parents: 10145
diff changeset
  1388
    def status(self, match, subrepos, ignored, clean, unknown):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
  1389
        """Determine the status of the working copy relative to the
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
  1390
        dirstate and return a pair of (unsure, status), where status is of type
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
  1391
        scmutil.status and:
9518
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1392
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1393
          unsure:
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1394
            files that might have been modified since the dirstate was
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1395
            written, but need to be read to be sure (size is the same
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1396
            but mtime differs)
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
  1397
          status.modified:
9518
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1398
            files that have definitely been modified since the dirstate
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1399
            was written (different size or mode)
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
  1400
          status.clean:
9518
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1401
            files that have definitely not been modified since the
bc19a0b04e83 dirstate: add/improve method docstrings.
Greg Ward <greg-hg@gerg.ca>
parents: 9509
diff changeset
  1402
            dirstate was written
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
  1403
        """
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
  1404
        listignored, listclean, listunknown = ignored, clean, unknown
2022
a59da8cc35e4 New option -i/--ignored for 'hg status' to show ignored files.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2008
diff changeset
  1405
        lookup, modified, added, unknown, ignored = [], [], [], [], []
2661
5c10b7ed3411 status: add -c (clean) and -A (all files) options
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2486
diff changeset
  1406
        removed, deleted, clean = [], [], []
723
9e0f3ba4a9c2 Work on walk code.
Bryan O'Sullivan <bos@serpentine.com>
parents: 705
diff changeset
  1407
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1408
        dmap = self._map
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
  1409
        dmap.preload()
43274
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1410
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1411
        use_rust = True
43917
40fd1ef4e4c1 rust-matchers: add support for `exactmatcher` in `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43891
diff changeset
  1412
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1413
        allowed_matchers = (
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1414
            matchmod.alwaysmatcher,
49479
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49467
diff changeset
  1415
            matchmod.differencematcher,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1416
            matchmod.exactmatcher,
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1417
            matchmod.includematcher,
49350
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49348
diff changeset
  1418
            matchmod.intersectionmatcher,
49351
97dcd6906e6f rust-dirstate: add support for nevermatcher
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49350
diff changeset
  1419
            matchmod.nevermatcher,
49348
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49310
diff changeset
  1420
            matchmod.unionmatcher,
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1421
        )
43917
40fd1ef4e4c1 rust-matchers: add support for `exactmatcher` in `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43891
diff changeset
  1422
43274
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1423
        if rustmod is None:
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1424
            use_rust = False
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1425
        elif self._checkcase:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1426
            # Case-insensitive filesystems are not handled yet
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1427
            use_rust = False
43274
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1428
        elif subrepos:
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1429
            use_rust = False
43917
40fd1ef4e4c1 rust-matchers: add support for `exactmatcher` in `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43891
diff changeset
  1430
        elif not isinstance(match, allowed_matchers):
44836
63edfea7dfde status: update comment to reflect the more recent situation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44801
diff changeset
  1431
            # Some matchers have yet to be implemented
43274
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1432
            use_rust = False
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1433
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1434
        # Get the time from the filesystem so we can disambiguate files that
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1435
        # appear modified in the present or future.
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1436
        try:
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1437
            mtime_boundary = timestamp.get_fs_now(self._opener)
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1438
        except OSError:
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1439
            # In largefiles or readonly context
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1440
            mtime_boundary = None
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1441
43274
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1442
        if use_rust:
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1443
            try:
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1444
                res = self._rust_status(
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1445
                    match, listclean, listignored, listunknown
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1446
                )
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1447
                return res + (mtime_boundary,)
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1448
            except rustmod.FallbackError:
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1449
                pass
43274
733d4ffcd667 rust-dirstate-status: add call to rust-fast path for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43239
diff changeset
  1450
43620
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
  1451
        def noop(f):
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
  1452
            pass
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
  1453
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
  1454
        dcontains = dmap.__contains__
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
  1455
        dget = dmap.__getitem__
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1456
        ladd = lookup.append  # aka "unsure"
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1457
        madd = modified.append
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1458
        aadd = added.append
43620
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
  1459
        uadd = unknown.append if listunknown else noop
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
  1460
        iadd = ignored.append if listignored else noop
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1461
        radd = removed.append
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1462
        dadd = deleted.append
43620
dd773340a085 dirstate: respect request to not list unknown/ignored/clean files (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 43612
diff changeset
  1463
        cadd = clean.append if listclean else noop
18034
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
  1464
        mexact = match.exact
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
  1465
        dirignore = self._dirignore
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
  1466
        checkexec = self._checkexec
48291
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1467
        checklink = self._checklink
34336
0865d25e8a8a dirstate: move _copymap to dirstatemap
Durham Goode <durham@fb.com>
parents: 34335
diff changeset
  1468
        copymap = self._map.copymap
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1469
19191
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
  1470
        # We need to do full walks when either
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
  1471
        # - we're listing all clean files, or
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
  1472
        # - match.traversedir does something, because match.traversedir should
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
  1473
        #   be called for every dir in the working dir
ab9de1e8fc36 dirstate.status: avoid full walks when possible
Siddharth Agarwal <sid0@fb.com>
parents: 19190
diff changeset
  1474
        full = listclean or match.traversedir is not None
48922
fe056166b40d dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
  1475
        for fn, st in self.walk(
fe056166b40d dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
  1476
            match, subrepos, listunknown, listignored, full=full
fe056166b40d dirstate: remove pycompat.iteritems()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
  1477
        ).items():
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
  1478
            if not dcontains(fn):
18034
1a570f04de07 dirstate: inline more properties and methods in status
Siddharth Agarwal <sid0@fb.com>
parents: 18032
diff changeset
  1479
                if (listignored or mexact(fn)) and dirignore(fn):
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
  1480
                    if listignored:
6033
a1ebd5cd7e55 dirstate.status: avoid putting ignored files in the unknown list
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6032
diff changeset
  1481
                        iadd(fn)
19910
601944f41257 dirstate.status: return explicit unknown files even when not asked
Siddharth Agarwal <sid0@fb.com>
parents: 19651
diff changeset
  1482
                else:
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1483
                    uadd(fn)
1471
f56f38a1a85f rewrote changes function in dirstate to use generic walk code
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
  1484
                continue
6591
eda3fd322a7f dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents: 6590
diff changeset
  1485
34935
ffeea2406276 dirstate: remove excess attribute lookups for dirstate.status (issue5714)
Durham Goode <durham@fb.com>
parents: 34934
diff changeset
  1486
            t = dget(fn)
47536
8e4b9fe31334 dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47535
diff changeset
  1487
            mode = t.mode
47537
0e5800c88eb4 dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47536
diff changeset
  1488
            size = t.size
6591
eda3fd322a7f dirstate: minor status cleanups
Matt Mackall <mpm@selenic.com>
parents: 6590
diff changeset
  1489
47531
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47530
diff changeset
  1490
            if not st and t.tracked:
6818
6e93fbd847ef dirstate.walk: eliminate src from yield
Matt Mackall <mpm@selenic.com>
parents: 6811
diff changeset
  1491
                dadd(fn)
48148
e2753a7acfa7 dirstate-item: use the `p2_info` property to replace more verbose call
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48147
diff changeset
  1492
            elif t.p2_info:
47533
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
  1493
                madd(fn)
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
  1494
            elif t.added:
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
  1495
                aadd(fn)
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
  1496
            elif t.removed:
174d0bcce2eb dirstate: reorder "state" checking conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
  1497
                radd(fn)
47534
e53a42dce923 dirstate: drop last explicite `state` usage in status
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47533
diff changeset
  1498
            elif t.tracked:
48291
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1499
                if not checklink and t.has_fallback_symlink:
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1500
                    # If the file system does not support symlink, the mode
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1501
                    # might not be correctly stored in the dirstate, so do not
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1502
                    # trust it.
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1503
                    ladd(fn)
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1504
                elif not checkexec and t.has_fallback_exec:
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1505
                    # If the file system does not support exec bits, the mode
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1506
                    # might not be correctly stored in the dirstate, so do not
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1507
                    # trust it.
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1508
                    ladd(fn)
500260410bb8 dirstate: make sure that status does not overlook the fallback flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48290
diff changeset
  1509
                elif (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1510
                    size >= 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1511
                    and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1512
                        (size != st.st_size and size != st.st_size & _rangemask)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1513
                        or ((mode ^ st.st_mode) & 0o100 and checkexec)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1514
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1515
                    or fn in copymap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1516
                ):
46703
ca69e29a2a30 formatting: fix redundant parentheses
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46678
diff changeset
  1517
                    if stat.S_ISLNK(st.st_mode) and size != st.st_size:
46678
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1518
                        # issue6456: Size returned may be longer due to
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1519
                        # encryption on EXT-4 fscrypt, undecided.
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1520
                        ladd(fn)
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1521
                    else:
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1522
                        madd(fn)
48260
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48252
diff changeset
  1523
                elif not t.mtime_likely_equal_to(timestamp.mtime_of(st)):
48391
b80e5e75d51e dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1524
                    # There might be a change in the future if for example the
b80e5e75d51e dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1525
                    # internal clock is off, but this is a case where the issues
b80e5e75d51e dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1526
                    # the user would face would be a lot worse and there is
b80e5e75d51e dirstate: remove `lastnormaltime` mechanism
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1527
                    # nothing we can really do.
13704
a464763e99f1 dirstate: avoid a race with multiple commits in the same process
Greg Ward <greg@gerg.ca>
parents: 13400
diff changeset
  1528
                    ladd(fn)
6753
ed5ffb2c12f3 repo.status: eliminate list_
Matt Mackall <mpm@selenic.com>
parents: 6750
diff changeset
  1529
                elif listclean:
5003
4b1acb3ecb3c dirstate: localize a bunch of methods in status fastpath
Matt Mackall <mpm@selenic.com>
parents: 5002
diff changeset
  1530
                    cadd(fn)
44530
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1531
        status = scmutil.status(
4d1634e59f13 rust-status: use bare hg status fastpath from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44357
diff changeset
  1532
            modified, added, removed, deleted, unknown, ignored, clean
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1533
        )
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48387
diff changeset
  1534
        return (lookup, status, mtime_boundary)
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1535
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1536
    def matches(self, match):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
  1537
        """
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1538
        return files in the dirstate (in whatever state) filtered by match
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45243
diff changeset
  1539
        """
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1540
        dmap = self._map
44357
bed8d08cfcb2 rust-dirstatemap: remove additional lookup in dirstate.matches
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44297
diff changeset
  1541
        if rustmod is not None:
48121
5fc2dfb073d6 dirstatemap: rename `_rustmap` to `_map`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48107
diff changeset
  1542
            dmap = self._map._map
44357
bed8d08cfcb2 rust-dirstatemap: remove additional lookup in dirstate.matches
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44297
diff changeset
  1543
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1544
        if match.always():
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1545
            return dmap.keys()
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1546
        files = match.files()
24448
55c449345b10 match: add isexact() method to hide internals
Martin von Zweigbergk <martinvonz@google.com>
parents: 24212
diff changeset
  1547
        if match.isexact():
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1548
            # fast path -- filter the other way around, since typically files is
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1549
            # much smaller than dmap
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1550
            return [f for f in files if f in dmap]
25275
d94e403b5237 dirstate: use match.prefix() instead of 'not match.anypats()'
Martin von Zweigbergk <martinvonz@google.com>
parents: 25234
diff changeset
  1551
        if match.prefix() and all(fn in dmap for fn in files):
21984
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1552
            # fast path -- all the values are known to be files, so just return
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1553
            # that
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1554
            return list(files)
977a0b9af5ac dirstate: add a method to efficiently filter by match
Siddharth Agarwal <sid0@fb.com>
parents: 21931
diff changeset
  1555
        return [f for f in dmap if match(f)]
26632
59b5e8844eb0 dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26630
diff changeset
  1556
26746
3c1d297fe929 dirstateguard: remove layering violation around saving/restoring backup
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26635
diff changeset
  1557
    def _actualfilename(self, tr):
3c1d297fe929 dirstateguard: remove layering violation around saving/restoring backup
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26635
diff changeset
  1558
        if tr:
26633
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1559
            return self._pendingfilename
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1560
        else:
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1561
            return self._filename
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1562
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1563
    def data_backup_filename(self, backupname):
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1564
        if not self._use_dirstate_v2:
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1565
            return None
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1566
        return backupname + b'.v2-data'
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1567
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1568
    def _new_backup_data_filename(self, backupname):
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1569
        """return a filename to backup a data-file or None"""
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1570
        if not self._use_dirstate_v2:
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1571
            return None
50002
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1572
        if self._map.docket.uuid is None:
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1573
            # not created yet, nothing to backup
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1574
            return None
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1575
        data_filename = self._map.docket.data_filename()
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1576
        return data_filename, self.data_backup_filename(backupname)
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1577
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1578
    def backup_data_file(self, backupname):
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1579
        if not self._use_dirstate_v2:
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1580
            return None
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1581
        docket = docketmod.DirstateDocket.parse(
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1582
            self._opener.read(backupname),
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1583
            self._nodeconstants,
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1584
        )
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1585
        return self.data_backup_filename(backupname), docket.data_filename()
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1586
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1587
    def savebackup(self, tr, backupname):
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1588
        '''Save current dirstate into backup file'''
26746
3c1d297fe929 dirstateguard: remove layering violation around saving/restoring backup
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26635
diff changeset
  1589
        filename = self._actualfilename(tr)
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1590
        assert backupname != filename
26633
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1591
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1592
        # use '_writedirstate' instead of 'write' to write changes certainly,
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1593
        # because the latter omits writing out if transaction is running.
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1594
        # output file will be used to create backup of dirstate at this point.
50002
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1595
        if self._dirty:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1596
            self._writedirstate(
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47673
diff changeset
  1597
                tr,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47673
diff changeset
  1598
                self._opener(filename, b"w", atomictemp=True, checkambig=True),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1599
            )
26633
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1600
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1601
        if tr:
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1602
            # ensure that subsequent tr.writepending returns True for
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1603
            # changes written out above, even if dirstate is never
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1604
            # changed after this
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1605
            tr.addfilegenerator(
48683
111f5a0cbcaa dirstate: rename the filegenerator used for writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48682
diff changeset
  1606
                b'dirstate-1-main',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1607
                (self._filename,),
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47673
diff changeset
  1608
                lambda f: self._writedirstate(tr, f),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1609
                location=b'plain',
48685
21ac6aedd5e5 transaction: do not rely on a global variable to post_finalize file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48684
diff changeset
  1610
                post_finalize=True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42927
diff changeset
  1611
            )
26633
020b12d591f3 dirstate: make functions for backup aware of transaction activity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26632
diff changeset
  1612
31547
ddadb6b0b58e dirstate: use tryunlink
Ryan McElroy <rmcelroy@fb.com>
parents: 31507
diff changeset
  1613
        self._opener.tryunlink(backupname)
50002
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1614
        if self._opener.exists(filename):
50001
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1615
            # hardlink backup is okay because _writedirstate is always called
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1616
            # with an "atomictemp=True" file.
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1617
            util.copyfile(
50001
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1618
                self._opener.join(filename),
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1619
                self._opener.join(backupname),
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1620
                hardlink=True,
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1621
            )
50001
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1622
            data_pair = self._new_backup_data_filename(backupname)
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1623
            if data_pair is not None:
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1624
                data_filename, bck_data_filename = data_pair
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1625
                util.copyfile(
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1626
                    self._opener.join(data_filename),
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1627
                    self._opener.join(bck_data_filename),
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1628
                    hardlink=True,
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1629
                )
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1630
                if tr is not None:
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1631
                    # ensure that pending file written above is unlinked at
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1632
                    # failure, even if tr.writepending isn't invoked until the
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1633
                    # end of this transaction
9313d8666a0f dirstate: pre-indent some of the backup code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49966
diff changeset
  1634
                    tr.registertmp(bck_data_filename, location=b'plain')
26632
59b5e8844eb0 dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26630
diff changeset
  1635
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1636
    def restorebackup(self, tr, backupname):
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1637
        '''Restore dirstate by backup file'''
26632
59b5e8844eb0 dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26630
diff changeset
  1638
        # this "invalidate()" prevents "wlock.release()" from writing
59b5e8844eb0 dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26630
diff changeset
  1639
        # changes of dirstate out after restoring from backup file
59b5e8844eb0 dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26630
diff changeset
  1640
        self.invalidate()
50002
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1641
        o = self._opener
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1642
        if not o.exists(backupname):
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1643
            # there was no file backup, delete existing files
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1644
            filename = self._actualfilename(tr)
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1645
            data_file = None
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1646
            if self._use_dirstate_v2:
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1647
                data_file = self._map.docket.data_filename()
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1648
            if o.exists(filename):
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1649
                o.unlink(filename)
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1650
            if data_file is not None and o.exists(data_file):
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1651
                o.unlink(data_file)
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1652
            return
26746
3c1d297fe929 dirstateguard: remove layering violation around saving/restoring backup
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26635
diff changeset
  1653
        filename = self._actualfilename(tr)
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1654
        data_pair = self.backup_data_file(backupname)
50002
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1655
        if o.exists(filename) and util.samefile(
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1656
            o.join(backupname), o.join(filename)
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1657
        ):
34940
c2b30348930f dirstate: clean up when restoring identical backups
Mark Thomas <mbthomas@fb.com>
parents: 34935
diff changeset
  1658
            o.unlink(backupname)
c2b30348930f dirstate: clean up when restoring identical backups
Mark Thomas <mbthomas@fb.com>
parents: 34935
diff changeset
  1659
        else:
c2b30348930f dirstate: clean up when restoring identical backups
Mark Thomas <mbthomas@fb.com>
parents: 34935
diff changeset
  1660
            o.rename(backupname, filename, checkambig=True)
26632
59b5e8844eb0 dirstate: move code paths for backup from dirstateguard to dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26630
diff changeset
  1661
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1662
        if data_pair is not None:
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1663
            data_backup, target = data_pair
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1664
            if o.exists(target) and util.samefile(
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1665
                o.join(data_backup), o.join(target)
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1666
            ):
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1667
                o.unlink(data_backup)
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1668
            else:
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1669
                o.rename(data_backup, target, checkambig=True)
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1670
33440
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1671
    def clearbackup(self, tr, backupname):
ec306bc6915b dirstate: update backup functions to take full backup filename
Adam Simpkins <simpkins@fb.com>
parents: 33373
diff changeset
  1672
        '''Clear backup file'''
49467
0705afae6253 dirstate-v2: backup the data file during the transaction (issue6730)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49361
diff changeset
  1673
        o = self._opener
50002
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1674
        if o.exists(backupname):
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1675
            data_backup = self.backup_data_file(backupname)
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1676
            o.unlink(backupname)
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1677
            if data_backup is not None:
e358f6e0e50e dirstate: do not write an empty dirstate just for backup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50001
diff changeset
  1678
                o.unlink(data_backup[0])
48089
c87844960a35 dirstate: move verification code within the dirstate itself
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48085
diff changeset
  1679
49827
d09a57ce6fc4 verify: print short `p1` node in relevant dirstate messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49824
diff changeset
  1680
    def verify(self, m1, m2, p1, narrow_matcher=None):
49823
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1681
        """
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1682
        check the dirstate contents against the parent manifest and yield errors
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1683
        """
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1684
        missing_from_p1 = _(
49827
d09a57ce6fc4 verify: print short `p1` node in relevant dirstate messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49824
diff changeset
  1685
            b"%s marked as tracked in p1 (%s) but not in manifest1\n"
49823
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1686
        )
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1687
        unexpected_in_p1 = _(b"%s marked as added, but also in manifest1\n")
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1688
        missing_from_ps = _(
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1689
            b"%s marked as modified, but not in either manifest\n"
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1690
        )
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1691
        missing_from_ds = _(
49827
d09a57ce6fc4 verify: print short `p1` node in relevant dirstate messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49824
diff changeset
  1692
            b"%s in manifest1, but not marked as tracked in p1 (%s)\n"
49823
2715c8549f4b dirstate: update messages in verify to not use the old `state` API
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49822
diff changeset
  1693
        )
48089
c87844960a35 dirstate: move verification code within the dirstate itself
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48085
diff changeset
  1694
        for f, entry in self.items():
49821
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
  1695
            if entry.p1_tracked:
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
  1696
                if entry.modified and f not in m1 and f not in m2:
49824
fdd227585d5a verify: format messages directly at the source
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49823
diff changeset
  1697
                    yield missing_from_ps % f
49821
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
  1698
                elif f not in m1:
49827
d09a57ce6fc4 verify: print short `p1` node in relevant dirstate messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49824
diff changeset
  1699
                    yield missing_from_p1 % (f, node.short(p1))
49821
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
  1700
            if entry.added and f in m1:
49824
fdd227585d5a verify: format messages directly at the source
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49823
diff changeset
  1701
                yield unexpected_in_p1 % f
48089
c87844960a35 dirstate: move verification code within the dirstate itself
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48085
diff changeset
  1702
        for f in m1:
49822
1d8721be2428 dirstate: add narrow support to `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49821
diff changeset
  1703
            if narrow_matcher is not None and not narrow_matcher(f):
1d8721be2428 dirstate: add narrow support to `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49821
diff changeset
  1704
                continue
49821
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
  1705
            entry = self.get_entry(f)
8f200511cdc7 dirstate: stop using `entry.state()` for logic in `verify`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49479
diff changeset
  1706
            if not entry.p1_tracked:
49827
d09a57ce6fc4 verify: print short `p1` node in relevant dirstate messages
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49824
diff changeset
  1707
                yield missing_from_ds % (f, node.short(p1))