mercurial/context.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 26 Sep 2023 00:55:49 +0200
changeset 51024 299b7b5440db
parent 50929 18c8c18993f0
child 51762 dcbe7fda53e4
permissions -rw-r--r--
revlog: drop the df argument to `sidedata` The intend of this argument is better filled by the `revlog.reading` or `revlog._writing` context. So we drop it to leave rooms for further cleanup and improvements.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     1
# context.py - changeset and file context objects for mercurial
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
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 2006, 2007 Olivia Mackall <olivia@selenic.com>
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
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: 10262
diff changeset
     6
# GNU General Public License version 2 or any later version.
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
     8
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
     9
import filecmp
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    10
import os
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    11
import stat
26604
a3fcc8e3136b context: don't hex encode all unknown 20 char revision specs (issue4890)
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
    12
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    13
from .i18n import _
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    14
from .node import (
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    15
    hex,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    16
    nullrev,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    17
    short,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    18
)
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    19
from . import (
36917
7affcabf561e dagop: move annotateline and _annotatepair from context.py
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
    20
    dagop,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    21
    encoding,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    22
    error,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    23
    fileset,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    24
    match as matchmod,
44857
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
    25
    mergestate as mergestatemod,
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44934
diff changeset
    26
    metadata,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    27
    obsolete as obsmod,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    28
    patch,
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
    29
    pathutil,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    30
    phases,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    31
    repoview,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    32
    scmutil,
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
    33
    sparse,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    34
    subrepo,
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35890
diff changeset
    35
    subrepoutil,
50215
ae61851e6fe2 dirstate: add a way to test races happening during status
Raphaël Gomès <rgomes@octobus.net>, Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49306
diff changeset
    36
    testing,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    37
    util,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    38
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37066
diff changeset
    39
from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37066
diff changeset
    40
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37066
diff changeset
    41
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37066
diff changeset
    42
)
48381
41f40f35278a status: gather fixup info at comparison time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48095
diff changeset
    43
from .dirstateutils import (
41f40f35278a status: gather fixup info at comparison time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48095
diff changeset
    44
    timestamp,
41f40f35278a status: gather fixup info at comparison time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48095
diff changeset
    45
)
3122
da85145d4571 filectx: add rename traversal for parents()
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
    46
8207
dd8d5be57d65 util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents: 8157
diff changeset
    47
propertycache = util.propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
    48
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
    49
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
    50
class basectx:
19537
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    51
    """A basectx object represents the common logic for its children:
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    52
    changectx: read-only context that is already present in the repo,
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    53
    workingctx: a context that represents the working directory and can
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    54
                be committed,
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    55
    memctx: a context that represents changes in-memory and can also
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    56
            be committed."""
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
    57
37175
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
    58
    def __init__(self, repo):
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
    59
        self._repo = repo
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
    60
31344
c99371e38e5e context: implement both __bytes__ and __str__ for Python 3
Augie Fackler <augie@google.com>
parents: 31343
diff changeset
    61
    def __bytes__(self):
19540
7b864da00e21 basectx: move __str__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19539
diff changeset
    62
        return short(self.node())
7b864da00e21 basectx: move __str__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19539
diff changeset
    63
33022
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33019
diff changeset
    64
    __str__ = encoding.strmethod(__bytes__)
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33019
diff changeset
    65
19546
a45cf68dd9a2 basectx: move __repr__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19545
diff changeset
    66
    def __repr__(self):
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43346
diff changeset
    67
        return "<%s %s>" % (type(self).__name__, str(self))
19546
a45cf68dd9a2 basectx: move __repr__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19545
diff changeset
    68
19547
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    69
    def __eq__(self, other):
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    70
        try:
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    71
            return type(self) == type(other) and self._rev == other._rev
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    72
        except AttributeError:
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    73
            return False
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    74
19548
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    75
    def __ne__(self, other):
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    76
        return not (self == other)
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    77
19550
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    78
    def __contains__(self, key):
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    79
        return key in self._manifest
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    80
19551
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    81
    def __getitem__(self, key):
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    82
        return self.filectx(key)
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    83
19552
6b76070c4b54 basectx: move __iter__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19551
diff changeset
    84
    def __iter__(self):
24227
8ec2df32bd39 context: don't sort manifest entries
Augie Fackler <augie@google.com>
parents: 24213
diff changeset
    85
        return iter(self._manifest)
19552
6b76070c4b54 basectx: move __iter__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19551
diff changeset
    86
31261
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
    87
    def _buildstatusmanifest(self, status):
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
    88
        """Builds a manifest that includes the given status results, if this is
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
    89
        a working copy context. For non-working copy contexts, it just returns
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
    90
        the normal manifest."""
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
    91
        return self.manifest()
21880
e6754f5e4cf7 context: generate filtered manifest efficiently for exact matchers
Siddharth Agarwal <sid0@fb.com>
parents: 21845
diff changeset
    92
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
    93
    def _matchstatus(self, other, match):
33936
c714e82b9ac2 context: always pass a matcher into _matchstatus() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33901
diff changeset
    94
        """This internal method provides a way for child objects to override the
21481
2f1567ef70ba basectx: add _matchstatus method for factoring out last of parentworking logic
Sean Farley <sean.michael.farley@gmail.com>
parents: 21480
diff changeset
    95
        match operator.
2f1567ef70ba basectx: add _matchstatus method for factoring out last of parentworking logic
Sean Farley <sean.michael.farley@gmail.com>
parents: 21480
diff changeset
    96
        """
33936
c714e82b9ac2 context: always pass a matcher into _matchstatus() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33901
diff changeset
    97
        return match
21481
2f1567ef70ba basectx: add _matchstatus method for factoring out last of parentworking logic
Sean Farley <sean.michael.farley@gmail.com>
parents: 21480
diff changeset
    98
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
    99
    def _buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   100
        self, other, s, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   101
    ):
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   102
        """build a status with respect to another context"""
23257
37c57a7cf160 context.status: explain "caching reasons" more fully
Martin von Zweigbergk <martinvonz@google.com>
parents: 23242
diff changeset
   103
        # Load earliest manifest first for caching reasons. More specifically,
37c57a7cf160 context.status: explain "caching reasons" more fully
Martin von Zweigbergk <martinvonz@google.com>
parents: 23242
diff changeset
   104
        # if you have revisions 1000 and 1001, 1001 is probably stored as a
37c57a7cf160 context.status: explain "caching reasons" more fully
Martin von Zweigbergk <martinvonz@google.com>
parents: 23242
diff changeset
   105
        # delta against 1000. Thus, if you read 1000 first, we'll reconstruct
37c57a7cf160 context.status: explain "caching reasons" more fully
Martin von Zweigbergk <martinvonz@google.com>
parents: 23242
diff changeset
   106
        # 1000 and cache it so that when you read 1001, we just need to apply a
37c57a7cf160 context.status: explain "caching reasons" more fully
Martin von Zweigbergk <martinvonz@google.com>
parents: 23242
diff changeset
   107
        # delta to what's in the cache. So that's one full reconstruction + one
37c57a7cf160 context.status: explain "caching reasons" more fully
Martin von Zweigbergk <martinvonz@google.com>
parents: 23242
diff changeset
   108
        # delta application.
31260
aac054e5389b context: remove assumptions about manifest creation during _buildstatus
Durham Goode <durham@fb.com>
parents: 31259
diff changeset
   109
        mf2 = None
23238
39eb9f78f968 context.status: move manifest caching trick to _buildstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23237
diff changeset
   110
        if self.rev() is not None and self.rev() < other.rev():
31261
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
   111
            mf2 = self._buildstatusmanifest(s)
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
   112
        mf1 = other._buildstatusmanifest(s)
31260
aac054e5389b context: remove assumptions about manifest creation during _buildstatus
Durham Goode <durham@fb.com>
parents: 31259
diff changeset
   113
        if mf2 is None:
31261
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
   114
            mf2 = self._buildstatusmanifest(s)
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   115
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   116
        modified, added = [], []
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   117
        removed = []
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   118
        clean = []
23304
dd3f857598a0 context.status: pass status tuple into _buildstatus
Martin von Zweigbergk <martinvonz@google.com>
parents: 23303
diff changeset
   119
        deleted, unknown, ignored = s.deleted, s.unknown, s.ignored
23085
e9165c18f8df status: make 'hg status --rev' faster when there are deleted files
Martin von Zweigbergk <martinvonz@google.com>
parents: 23080
diff changeset
   120
        deletedset = set(deleted)
31261
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31260
diff changeset
   121
        d = mf1.diff(mf2, match=match, clean=listclean)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   122
        for fn, value in d.items():
23731
ccbaa2ed11a4 status: don't list files as both clean and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23730
diff changeset
   123
            if fn in deletedset:
ccbaa2ed11a4 status: don't list files as both clean and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23730
diff changeset
   124
                continue
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   125
            if value is None:
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   126
                clean.append(fn)
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   127
                continue
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   128
            (node1, flag1), (node2, flag2) = value
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   129
            if node1 is None:
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   130
                added.append(fn)
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   131
            elif node2 is None:
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   132
                removed.append(fn)
27749
215b47449e47 context: check for differing flags a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 27748
diff changeset
   133
            elif flag1 != flag2:
215b47449e47 context: check for differing flags a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 27748
diff changeset
   134
                modified.append(fn)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   135
            elif node2 not in self._repo.nodeconstants.wdirfilenodeids:
27748
81b391a45264 context: clarify why we don't compare file contents when nodeid differs
Martin von Zweigbergk <martinvonz@google.com>
parents: 27747
diff changeset
   136
                # When comparing files between two commits, we save time by
81b391a45264 context: clarify why we don't compare file contents when nodeid differs
Martin von Zweigbergk <martinvonz@google.com>
parents: 27747
diff changeset
   137
                # not comparing the file contents when the nodeids differ.
81b391a45264 context: clarify why we don't compare file contents when nodeid differs
Martin von Zweigbergk <martinvonz@google.com>
parents: 27747
diff changeset
   138
                # Note that this means we incorrectly report a reverted change
81b391a45264 context: clarify why we don't compare file contents when nodeid differs
Martin von Zweigbergk <martinvonz@google.com>
parents: 27747
diff changeset
   139
                # to a file as a modification.
27747
54522bbe1597 status: back out changeset 89f49813526c
Martin von Zweigbergk <martinvonz@google.com>
parents: 27720
diff changeset
   140
                modified.append(fn)
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   141
            elif self[fn].cmp(other[fn]):
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   142
                modified.append(fn)
23731
ccbaa2ed11a4 status: don't list files as both clean and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23730
diff changeset
   143
            else:
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   144
                clean.append(fn)
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   145
21971
412ac613fd89 status: explicitly exclude removed file from unknown and ignored
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21938
diff changeset
   146
        if removed:
412ac613fd89 status: explicitly exclude removed file from unknown and ignored
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21938
diff changeset
   147
            # need to filter files if they are already reported as removed
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   148
            unknown = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   149
                fn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   150
                for fn in unknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   151
                if fn not in mf1 and (not match or match(fn))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   152
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   153
            ignored = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   154
                fn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   155
                for fn in ignored
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   156
                if fn not in mf1 and (not match or match(fn))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   157
            ]
23730
4b56219a5ac2 status: don't list files as both removed and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23712
diff changeset
   158
            # if they're deleted, don't report them as removed
4b56219a5ac2 status: don't list files as both removed and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23712
diff changeset
   159
            removed = [fn for fn in removed if fn not in deletedset]
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   160
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   161
        return scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   162
            modified, added, removed, deleted, unknown, ignored, clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   163
        )
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   164
19549
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   165
    @propertycache
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   166
    def substate(self):
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35890
diff changeset
   167
        return subrepoutil.state(self, self._repo.ui)
19549
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   168
21586
8a2637cf1130 basectx: add subrev method to return the rev of a subrepo given a subpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21482
diff changeset
   169
    def subrev(self, subpath):
8a2637cf1130 basectx: add subrev method to return the rev of a subrepo given a subpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21482
diff changeset
   170
        return self.substate[subpath][1]
8a2637cf1130 basectx: add subrev method to return the rev of a subrepo given a subpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21482
diff changeset
   171
19541
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   172
    def rev(self):
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   173
        return self._rev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   174
19542
bd95621a2d56 basectx: move node from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19541
diff changeset
   175
    def node(self):
bd95621a2d56 basectx: move node from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19541
diff changeset
   176
        return self._node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   177
19543
18f4951222f4 basectx: move hex from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19542
diff changeset
   178
    def hex(self):
19544
74924fa3236d basectx: change _node to node() in hex
Sean Farley <sean.michael.farley@gmail.com>
parents: 19543
diff changeset
   179
        return hex(self.node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   180
19553
64a99d972b9e basectx: move manifest from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19552
diff changeset
   181
    def manifest(self):
64a99d972b9e basectx: move manifest from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19552
diff changeset
   182
        return self._manifest
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   183
30344
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   184
    def manifestctx(self):
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   185
        return self._manifestctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   186
24300
a07314472a80 context: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24227
diff changeset
   187
    def repo(self):
a07314472a80 context: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24227
diff changeset
   188
        return self._repo
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   189
19554
98f8875f4baa basectx: move phasestr from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19553
diff changeset
   190
    def phasestr(self):
98f8875f4baa basectx: move phasestr from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19553
diff changeset
   191
        return phases.phasenames[self.phase()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   192
19555
613b70fedc4e basectx: move mutable from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19554
diff changeset
   193
    def mutable(self):
613b70fedc4e basectx: move mutable from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19554
diff changeset
   194
        return self.phase() > phases.public
19541
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   195
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
   196
    def matchfileset(self, cwd, expr, badfn=None):
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
   197
        return fileset.match(self, cwd, expr, badfn=badfn)
20400
f0137d994c83 context: add a getfileset() method so fewer things need fileset directly
Augie Fackler <raf@durin42.com>
parents: 20292
diff changeset
   198
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   199
    def obsolete(self):
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   200
        """True if the changeset is obsolete"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   201
        return self.rev() in obsmod.getrevs(self._repo, b'obsolete')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   202
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   203
    def extinct(self):
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   204
        """True if the changeset is extinct"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   205
        return self.rev() in obsmod.getrevs(self._repo, b'extinct')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   206
33727
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33726
diff changeset
   207
    def orphan(self):
39292
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   208
        """True if the changeset is not obsolete, but its ancestor is"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   209
        return self.rev() in obsmod.getrevs(self._repo, b'orphan')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   210
33729
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33728
diff changeset
   211
    def phasedivergent(self):
39292
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   212
        """True if the changeset tries to be a successor of a public changeset
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   213
39292
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   214
        Only non-public and non-obsolete changesets may be phase-divergent.
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   215
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   216
        return self.rev() in obsmod.getrevs(self._repo, b'phasedivergent')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   217
33728
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33727
diff changeset
   218
    def contentdivergent(self):
39292
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   219
        """Is a successor of a changeset with multiple possible successor sets
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   220
39292
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   221
        Only non-public and non-obsolete changesets may be content-divergent.
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   222
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   223
        return self.rev() in obsmod.getrevs(self._repo, b'contentdivergent')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   224
33730
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33729
diff changeset
   225
    def isunstable(self):
39292
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   226
        """True if the changeset is either orphan, phase-divergent or
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39197
diff changeset
   227
        content-divergent"""
33729
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33728
diff changeset
   228
        return self.orphan() or self.phasedivergent() or self.contentdivergent()
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   229
33726
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33689
diff changeset
   230
    def instabilities(self):
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33689
diff changeset
   231
        """return the list of instabilities affecting this changeset.
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33689
diff changeset
   232
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33689
diff changeset
   233
        Instabilities are returned as strings. possible values are:
33667
03039ff3082b evolution: rename unstable to orphan
Boris Feld <boris.feld@octobus.net>
parents: 33501
diff changeset
   234
        - orphan,
33689
9c27a2891b75 evolution: rename bumped to phase-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33688
diff changeset
   235
        - phase-divergent,
33688
2194a8723138 evolution: rename divergent to content-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33667
diff changeset
   236
        - content-divergent.
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   237
        """
33726
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33689
diff changeset
   238
        instabilities = []
33727
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33726
diff changeset
   239
        if self.orphan():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
            instabilities.append(b'orphan')
33729
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33728
diff changeset
   241
        if self.phasedivergent():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
            instabilities.append(b'phase-divergent')
33728
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33727
diff changeset
   243
        if self.contentdivergent():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
            instabilities.append(b'content-divergent')
33726
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33689
diff changeset
   245
        return instabilities
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   246
19556
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   247
    def parents(self):
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   248
        """return contexts for each parent changeset"""
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   249
        return self._parents
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   250
19557
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   251
    def p1(self):
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   252
        return self._parents[0]
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   253
19558
d0448e9d4554 basectx: move p2 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19557
diff changeset
   254
    def p2(self):
27064
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   255
        parents = self._parents
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   256
        if len(parents) == 2:
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   257
            return parents[1]
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
   258
        return self._repo[nullrev]
19558
d0448e9d4554 basectx: move p2 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19557
diff changeset
   259
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   260
    def _fileinfo(self, path):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
   261
        if '_manifest' in self.__dict__:
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   262
            try:
44354
2e2cfc3bea0b context: use manifest.find() instead of two separate calls
Augie Fackler <augie@google.com>
parents: 44263
diff changeset
   263
                return self._manifest.find(path)
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   264
            except KeyError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   265
                raise error.ManifestLookupError(
45489
a108f7ff7778 py3: don't risk passing a None value to error.ManifestLookupError()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45228
diff changeset
   266
                    self._node or b'None', path, _(b'not found in manifest')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   267
                )
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
   268
        if '_manifestdelta' in self.__dict__ or path in self.files():
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   269
            if path in self._manifestdelta:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   270
                return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   271
                    self._manifestdelta[path],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   272
                    self._manifestdelta.flags(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   273
                )
30340
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30275
diff changeset
   274
        mfl = self._repo.manifestlog
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30275
diff changeset
   275
        try:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30275
diff changeset
   276
            node, flag = mfl[self._changeset.manifest].find(path)
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30275
diff changeset
   277
        except KeyError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   278
            raise error.ManifestLookupError(
45489
a108f7ff7778 py3: don't risk passing a None value to error.ManifestLookupError()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45228
diff changeset
   279
                self._node or b'None', path, _(b'not found in manifest')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   280
            )
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   281
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   282
        return node, flag
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   283
19560
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   284
    def filenode(self, path):
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   285
        return self._fileinfo(path)[0]
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   286
19561
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   287
    def flags(self, path):
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   288
        try:
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   289
            return self._fileinfo(path)[1]
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   290
        except error.LookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   291
            return b''
19561
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   292
42291
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   293
    @propertycache
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   294
    def _copies(self):
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44934
diff changeset
   295
        return metadata.computechangesetcopies(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   296
42291
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   297
    def p1copies(self):
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   298
        return self._copies[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   299
42291
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   300
    def p2copies(self):
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   301
        return self._copies[1]
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
   302
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28488
diff changeset
   303
    def sub(self, path, allowcreate=True):
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   304
        '''return a subrepo for the stored revision of path, never wdir()'''
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28488
diff changeset
   305
        return subrepo.subrepo(self, path, allowcreate=allowcreate)
19562
389d7767630d basectx: move sub from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19561
diff changeset
   306
25417
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   307
    def nullsub(self, path, pctx):
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   308
        return subrepo.nullsubrepo(self, path, pctx)
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   309
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   310
    def workingsub(self, path):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
   311
        """return a subrepo for the stored revision, or wdir if this is a wdir
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   312
        context.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
   313
        """
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   314
        return subrepo.subrepo(self, path, allowwdir=True)
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   315
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   316
    def match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   317
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   318
        pats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   319
        include=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   320
        exclude=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
        default=b'glob',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   322
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   323
        badfn=None,
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
   324
        cwd=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   325
    ):
19563
87503cd824fa basectx: move match from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19562
diff changeset
   326
        r = self._repo
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
   327
        if not cwd:
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
   328
            cwd = r.getcwd()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   329
        return matchmod.match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   330
            r.root,
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
   331
            cwd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   332
            pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   333
            include,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   334
            exclude,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   335
            default,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   336
            auditor=r.nofsauditor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   337
            ctx=self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   338
            listsubrepos=listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   339
            badfn=badfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   340
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   341
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   342
    def diff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   343
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   344
        ctx2=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   345
        match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   346
        changes=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   347
        opts=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   348
        losedatafn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   349
        pathfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   350
        copy=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   351
        copysourcematch=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   352
        hunksfilterfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   353
    ):
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   354
        """Returns a diff generator for the given contexts and matcher"""
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   355
        if ctx2 is None:
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   356
            ctx2 = self.p1()
19568
f58235d85d6b basectx: remove unnecessary check of instance
Sean Farley <sean.michael.farley@gmail.com>
parents: 19567
diff changeset
   357
        if ctx2 is not None:
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   358
            ctx2 = self._repo[ctx2]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   359
        return patch.diff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   360
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   361
            ctx2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   362
            self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   363
            match=match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   364
            changes=changes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   365
            opts=opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   366
            losedatafn=losedatafn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   367
            pathfn=pathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   368
            copy=copy,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   369
            copysourcematch=copysourcematch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   370
            hunksfilterfn=hunksfilterfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   371
        )
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   372
24323
4c7c6beade1a manifest: have context's dirs() call its manifest's dirs()
Drew Gottlieb <drgott@google.com>
parents: 24306
diff changeset
   373
    def dirs(self):
4c7c6beade1a manifest: have context's dirs() call its manifest's dirs()
Drew Gottlieb <drgott@google.com>
parents: 24306
diff changeset
   374
        return self._manifest.dirs()
19565
bd1580a9c133 basectx: move _dirs from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19564
diff changeset
   375
24325
79d9c51488ca manifest: add hasdir() to context
Drew Gottlieb <drgott@google.com>
parents: 24323
diff changeset
   376
    def hasdir(self, dir):
79d9c51488ca manifest: add hasdir() to context
Drew Gottlieb <drgott@google.com>
parents: 24323
diff changeset
   377
        return self._manifest.hasdir(dir)
19566
54817c774d38 basectx: move dirs from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19565
diff changeset
   378
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   379
    def status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   380
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   381
        other=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   382
        match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   383
        listignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   384
        listclean=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   385
        listunknown=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   386
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   387
    ):
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   388
        """return status of files between two nodes or node and working
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   389
        directory.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   390
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   391
        If other is None, compare this node with working directory.
21722
ee29b0bb1619 status: document the content of the returned tuple in the docstring
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21718
diff changeset
   392
45896
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   393
        ctx1.status(ctx2) returns the status of change from ctx1 to ctx2
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   394
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   395
        Returns a mercurial.scmutils.status object.
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   396
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   397
        Data can be accessed using either tuple notation:
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   398
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   399
            (modified, added, removed, deleted, unknown, ignored, clean)
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   400
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   401
        or direct attribute access:
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   402
e359af6517ce context: small update to ctx.status doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45499
diff changeset
   403
            s.modified, s.added, ...
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   404
        """
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   405
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   406
        ctx1 = self
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   407
        ctx2 = self._repo[other]
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   408
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   409
        # This next code block is, admittedly, fragile logic that tests for
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   410
        # reversing the contexts and wouldn't need to exist if it weren't for
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   411
        # the fast (and common) code path of comparing the working directory
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   412
        # with its first parent.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   413
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   414
        # What we're aiming for here is the ability to call:
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   415
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   416
        # workingctx.status(parentctx)
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   417
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   418
        # If we always built the manifest for each context and compared those,
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   419
        # then we'd be done. But the special case of the above call means we
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   420
        # just copy the manifest of the parent.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   421
        reversed = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   422
        if not isinstance(ctx1, changectx) and isinstance(ctx2, changectx):
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   423
            reversed = True
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   424
            ctx1, ctx2 = ctx2, ctx1
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   425
40083
48a0ce67d67a status: intersect matcher with narrow matcher instead of filtering afterwards
Martin von Zweigbergk <martinvonz@google.com>
parents: 40062
diff changeset
   426
        match = self._repo.narrowmatch(match)
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
   427
        match = ctx2._matchstatus(ctx1, match)
23304
dd3f857598a0 context.status: pass status tuple into _buildstatus
Martin von Zweigbergk <martinvonz@google.com>
parents: 23303
diff changeset
   428
        r = scmutil.status([], [], [], [], [], [], [])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   429
        r = ctx2._buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   430
            ctx1, r, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   431
        )
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   432
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   433
        if reversed:
23301
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   434
            # Reverse added and removed. Clear deleted, unknown and ignored as
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   435
            # these make no sense to reverse.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   436
            r = scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   437
                r.modified, r.removed, r.added, [], [], [], r.clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   438
            )
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   439
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   440
        if listsubrepos:
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   441
            for subpath, sub in scmutil.itersubrepos(ctx1, ctx2):
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   442
                try:
27183
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   443
                    rev2 = ctx2.subrev(subpath)
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   444
                except KeyError:
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   445
                    # A subrepo that existed in node1 was deleted between
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   446
                    # node1 and node2 (inclusive). Thus, ctx2's substate
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   447
                    # won't contain that subpath. The best we can do ignore it.
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   448
                    rev2 = None
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27983
diff changeset
   449
                submatch = matchmod.subdirmatcher(subpath, match)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   450
                s = sub.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   451
                    rev2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   452
                    match=submatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   453
                    ignored=listignored,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   454
                    clean=listclean,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   455
                    unknown=listunknown,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   456
                    listsubrepos=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   457
                )
43647
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   458
                for k in (
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   459
                    'modified',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   460
                    'added',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   461
                    'removed',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   462
                    'deleted',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   463
                    'unknown',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   464
                    'ignored',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   465
                    'clean',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   466
                ):
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   467
                    rfiles, sfiles = getattr(r, k), getattr(s, k)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
                    rfiles.extend(b"%s/%s" % (subpath, f) for f in sfiles)
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   469
43647
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   470
        r.modified.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   471
        r.added.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   472
        r.removed.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   473
        r.deleted.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   474
        r.unknown.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   475
        r.ignored.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43633
diff changeset
   476
        r.clean.sort()
21616
0a8e7f81e8ae context: explicitly return a tuple
Sean Farley <sean.michael.farley@gmail.com>
parents: 21595
diff changeset
   477
23301
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   478
        return r
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   479
44857
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
   480
    def mergestate(self, clean=False):
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
   481
        """Get a mergestate object for this context."""
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
   482
        raise NotImplementedError(
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
   483
            '%s does not implement mergestate()' % self.__class__
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
   484
        )
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
   485
45088
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   486
    def isempty(self):
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   487
        return not (
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   488
            len(self.parents()) > 1
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   489
            or self.branch() != self.p1().branch()
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   490
            or self.closesbranch()
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   491
            or self.files()
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   492
        )
3e40abe0a170 commit: factor out empty commit check to `basectx.isempty()`
Manuel Jacob <me@manueljacob.de>
parents: 45087
diff changeset
   493
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   494
19537
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
   495
class changectx(basectx):
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   496
    """A changecontext object makes access to data related to a particular
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19902
diff changeset
   497
    changeset convenient. It represents a read-only context already present in
19537
6e3e8575276d basectx: add an empty class that will be used as a parent of all contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19314
diff changeset
   498
    the repo."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   499
43760
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   500
    def __init__(self, repo, rev, node, maybe_filtered=True):
37175
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
   501
        super(changectx, self).__init__(repo)
39958
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
   502
        self._rev = rev
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39957
diff changeset
   503
        self._node = node
43760
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   504
        # When maybe_filtered is True, the revision might be affected by
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   505
        # changelog filtering and operation through the filtered changelog must be used.
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   506
        #
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   507
        # When maybe_filtered is False, the revision has already been checked
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   508
        # against filtering and is not filtered. Operation through the
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   509
        # unfiltered changelog might be used in some case.
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   510
        self._maybe_filtered = maybe_filtered
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   511
6469
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   512
    def __hash__(self):
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   513
        try:
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   514
            return hash(self._rev)
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   515
        except AttributeError:
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   516
            return id(self)
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   517
3168
05c588e1803d context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents: 3166
diff changeset
   518
    def __nonzero__(self):
3578
3b4e00cba57a Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3454
diff changeset
   519
        return self._rev != nullrev
3168
05c588e1803d context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents: 3166
diff changeset
   520
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
   521
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
   522
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   523
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   524
    def _changeset(self):
43760
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   525
        if self._maybe_filtered:
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   526
            repo = self._repo
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   527
        else:
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   528
            repo = self._repo.unfiltered()
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43647
diff changeset
   529
        return repo.changelog.changelogrevision(self.rev())
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   530
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   531
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   532
    def _manifest(self):
30344
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   533
        return self._manifestctx.read()
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   534
32519
6ae068f801e3 context: do not cache manifestctx
Jun Wu <quark@fb.com>
parents: 32486
diff changeset
   535
    @property
30344
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   536
    def _manifestctx(self):
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   537
        return self._repo.manifestlog[self._changeset.manifest]
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   538
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   539
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   540
    def _manifestdelta(self):
30344
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30340
diff changeset
   541
        return self._manifestctx.readdelta()
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   542
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   543
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   544
    def _parents(self):
27063
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   545
        repo = self._repo
43764
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43760
diff changeset
   546
        if self._maybe_filtered:
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43760
diff changeset
   547
            cl = repo.changelog
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43760
diff changeset
   548
        else:
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43760
diff changeset
   549
            cl = repo.unfiltered().changelog
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43760
diff changeset
   550
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43760
diff changeset
   551
        p1, p2 = cl.parentrevs(self._rev)
27063
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   552
        if p2 == nullrev:
44109
98349eddceef changectx: mark parent of changesets as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44108
diff changeset
   553
            return [changectx(repo, p1, cl.node(p1), maybe_filtered=False)]
98349eddceef changectx: mark parent of changesets as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44108
diff changeset
   554
        return [
98349eddceef changectx: mark parent of changesets as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44108
diff changeset
   555
            changectx(repo, p1, cl.node(p1), maybe_filtered=False),
98349eddceef changectx: mark parent of changesets as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44108
diff changeset
   556
            changectx(repo, p2, cl.node(p2), maybe_filtered=False),
98349eddceef changectx: mark parent of changesets as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44108
diff changeset
   557
        ]
3215
931288cf58a7 contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents: 3214
diff changeset
   558
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   559
    def changeset(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   560
        c = self._changeset
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   561
        return (
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   562
            c.manifest,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   563
            c.user,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   564
            c.date,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   565
            c.files,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   566
            c.description,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   567
            c.extra,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   568
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   569
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   570
    def manifestnode(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   571
        return self._changeset.manifest
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   572
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   573
    def user(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   574
        return self._changeset.user
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   575
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   576
    def date(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   577
        return self._changeset.date
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   578
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   579
    def files(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   580
        return self._changeset.files
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   581
42374
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   582
    def filesmodified(self):
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   583
        modified = set(self.files())
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   584
        modified.difference_update(self.filesadded())
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   585
        modified.difference_update(self.filesremoved())
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   586
        return sorted(modified)
43021
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42859
diff changeset
   587
42374
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   588
    def filesadded(self):
43021
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42859
diff changeset
   589
        filesadded = self._changeset.filesadded
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   590
        compute_on_none = True
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   591
        if self._repo.filecopiesmode == b'changeset-sidedata':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   592
            compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   593
        else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   594
            source = self._repo.ui.config(b'experimental', b'copies.read-from')
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   595
            if source == b'changeset-only':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   596
                compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   597
            elif source != b'compatibility':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   598
                # filelog mode, ignore any changelog content
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   599
                filesadded = None
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   600
        if filesadded is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   601
            if compute_on_none:
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44934
diff changeset
   602
                filesadded = metadata.computechangesetfilesadded(self)
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   603
            else:
43021
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42859
diff changeset
   604
                filesadded = []
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42859
diff changeset
   605
        return filesadded
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42859
diff changeset
   606
42374
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   607
    def filesremoved(self):
43022
15badd621825 context: clarify the various mode in the filesremoved method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43021
diff changeset
   608
        filesremoved = self._changeset.filesremoved
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   609
        compute_on_none = True
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   610
        if self._repo.filecopiesmode == b'changeset-sidedata':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   611
            compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   612
        else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   613
            source = self._repo.ui.config(b'experimental', b'copies.read-from')
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   614
            if source == b'changeset-only':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   615
                compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   616
            elif source != b'compatibility':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   617
                # filelog mode, ignore any changelog content
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   618
                filesremoved = None
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   619
        if filesremoved is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   620
            if compute_on_none:
44940
4c1d39215034 metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44934
diff changeset
   621
                filesremoved = metadata.computechangesetfilesremoved(self)
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   622
            else:
43022
15badd621825 context: clarify the various mode in the filesremoved method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43021
diff changeset
   623
                filesremoved = []
15badd621825 context: clarify the various mode in the filesremoved method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43021
diff changeset
   624
        return filesremoved
42374
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
   625
41755
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
   626
    @propertycache
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
   627
    def _copies(self):
42142
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42102
diff changeset
   628
        p1copies = self._changeset.p1copies
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42102
diff changeset
   629
        p2copies = self._changeset.p2copies
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   630
        compute_on_none = True
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   631
        if self._repo.filecopiesmode == b'changeset-sidedata':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   632
            compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   633
        else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   634
            source = self._repo.ui.config(b'experimental', b'copies.read-from')
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   635
            # If config says to get copy metadata only from changeset, then
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   636
            # return that, defaulting to {} if there was no copy metadata.  In
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   637
            # compatibility mode, we return copy data from the changeset if it
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   638
            # was recorded there, and otherwise we fall back to getting it from
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   639
            # the filelogs (below).
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   640
            #
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   641
            # If we are in compatiblity mode and there is not data in the
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   642
            # changeset), we get the copy metadata from the filelogs.
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   643
            #
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   644
            # otherwise, when config said to read only from filelog, we get the
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   645
            # copy metadata from the filelogs.
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   646
            if source == b'changeset-only':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   647
                compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   648
            elif source != b'compatibility':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   649
                # filelog mode, ignore any changelog content
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   650
                p1copies = p2copies = None
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   651
        if p1copies is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   652
            if compute_on_none:
43023
8af909893188 context: clarify the various mode in the _copies property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43022
diff changeset
   653
                p1copies, p2copies = super(changectx, self)._copies
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   654
            else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   655
                if p1copies is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   656
                    p1copies = {}
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   657
        if p2copies is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   658
            p2copies = {}
43023
8af909893188 context: clarify the various mode in the _copies property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43022
diff changeset
   659
        return p1copies, p2copies
8af909893188 context: clarify the various mode in the _copies property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43022
diff changeset
   660
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   661
    def description(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   662
        return self._changeset.description
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   663
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   664
    def branch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   665
        return encoding.tolocal(self._changeset.extra.get(b"branch"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   666
16720
e825a89de5d7 context: add changectx.closesbranch() method
Brodie Rao <brodie@sf.io>
parents: 16719
diff changeset
   667
    def closesbranch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   668
        return b'close' in self._changeset.extra
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   669
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   670
    def extra(self):
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   671
        """Return a dict of extra information."""
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   672
        return self._changeset.extra
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   673
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   674
    def tags(self):
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   675
        """Return a list of byte tag names"""
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   676
        return self._repo.nodetags(self._node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   677
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13235
diff changeset
   678
    def bookmarks(self):
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   679
        """Return a list of byte bookmark names."""
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13235
diff changeset
   680
        return self._repo.nodebookmarks(self._node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   681
48762
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   682
    def fast_rank(self):
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   683
        repo = self._repo
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   684
        if self._maybe_filtered:
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   685
            cl = repo.changelog
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   686
        else:
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   687
            cl = repo.unfiltered().changelog
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   688
        return cl.fast_rank(self._rev)
d5121df04808 rank: add context and template keyword
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48673
diff changeset
   689
15421
405ca90df2b1 phases: add a phase method to context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15337
diff changeset
   690
    def phase(self):
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16610
diff changeset
   691
        return self._repo._phasecache.phase(self._repo, self._rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   692
14644
f3a40fd7008c hidden: Add ``hidden`` method for context
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14528
diff changeset
   693
    def hidden(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   694
        return self._rev in repoview.filterrevs(self._repo, b'visible')
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   695
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   696
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   697
        return False
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   698
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   699
    def children(self):
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   700
        """return list of changectx contexts for each child changeset.
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   701
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   702
        This returns only the immediate child changesets. Use descendants() to
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   703
        recursively walk children.
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   704
        """
2627
b779319a532b context.py: self.repo is not defined, change to self._repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2566
diff changeset
   705
        c = self._repo.changelog.children(self._node)
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
   706
        return [self._repo[x] for x in c]
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   707
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   708
    def ancestors(self):
16866
91f3ac205816 revlog: ancestors(*revs) becomes ancestors(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16761
diff changeset
   709
        for a in self._repo.changelog.ancestors([self._rev]):
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
   710
            yield self._repo[a]
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   711
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   712
    def descendants(self):
35107
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   713
        """Recursively yield all children of the changeset.
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   714
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   715
        For just the immediate children, use children()
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35093
diff changeset
   716
        """
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
   717
        for d in self._repo.changelog.descendants([self._rev]):
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
   718
            yield self._repo[d]
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   719
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
   720
    def filectx(self, path, fileid=None, filelog=None):
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   721
        """get a file context from this changeset"""
2628
9999a796d389 context.py: filectxs was using a keyword arg, add it to filectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2627
diff changeset
   722
        if fileid is None:
9999a796d389 context.py: filectxs was using a keyword arg, add it to filectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2627
diff changeset
   723
            fileid = self.filenode(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   724
        return filectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   725
            self._repo, path, fileid=fileid, changectx=self, filelog=filelog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   726
        )
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   727
21203
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   728
    def ancestor(self, c2, warn=False):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   729
        """return the "best" ancestor context of self and c2
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   730
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   731
        If there are multiple candidates, it will show a message and check
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   732
        merge.preferancestor configuration before falling back to the
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   733
        revlog ancestor."""
9843
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   734
        # deal with workingctxs
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   735
        n2 = c2._node
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 13001
diff changeset
   736
        if n2 is None:
9843
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   737
            n2 = c2._parents[0]._node
21125
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   738
        cahs = self._repo.changelog.commonancestorsheads(self._node, n2)
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   739
        if not cahs:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
   740
            anc = self._repo.nodeconstants.nullid
21125
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   741
        elif len(cahs) == 1:
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   742
            anc = cahs[0]
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   743
        else:
25844
18541e9510c5 merge: make merge.preferancestor type and default consistent
Matt Mackall <mpm@selenic.com>
parents: 25757
diff changeset
   744
            # experimental config: merge.preferancestor
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   745
            for r in self._repo.ui.configlist(b'merge', b'preferancestor'):
22671
5220c12c43fd changectx: skip all invalid merge.preferancestor values
Mads Kiilerich <madski@unity3d.com>
parents: 22405
diff changeset
   746
                try:
37354
a6014392837e context: use revsymbol() in "merge.preferancestor" code
Martin von Zweigbergk <martinvonz@google.com>
parents: 37267
diff changeset
   747
                    ctx = scmutil.revsymbol(self._repo, r)
22671
5220c12c43fd changectx: skip all invalid merge.preferancestor values
Mads Kiilerich <madski@unity3d.com>
parents: 22405
diff changeset
   748
                except error.RepoLookupError:
22180
17011b36aac7 changectx: ancestor should only prefer merge.preferancestor if it is a revision
Mads Kiilerich <madski@unity3d.com>
parents: 21990
diff changeset
   749
                    continue
21126
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   750
                anc = ctx.node()
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   751
                if anc in cahs:
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   752
                    break
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   753
            else:
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   754
                anc = self._repo.changelog.ancestor(self._node, n2)
21203
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   755
            if warn:
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   756
                self._repo.ui.status(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   757
                    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   758
                        _(b"note: using %s as ancestor of %s and %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   759
                        % (short(anc), short(self._node), short(n2))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   760
                    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   761
                    + b''.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   762
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   763
                            b"      alternatively, use --config "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   764
                            b"merge.preferancestor=%s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   765
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   766
                        % short(n)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   767
                        for n in sorted(cahs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   768
                        if n != anc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   769
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   770
                )
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
   771
        return self._repo[anc]
3125
02b22fefc01f changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents: 3124
diff changeset
   772
38670
fbec9c0b32d3 context: rename descendant() to isancestorof()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38668
diff changeset
   773
    def isancestorof(self, other):
fbec9c0b32d3 context: rename descendant() to isancestorof()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38668
diff changeset
   774
        """True if this changeset is an ancestor of other"""
38668
21846c94e605 revlog: delete isdescendantrev() in favor of isancestorrev()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38664
diff changeset
   775
        return self._repo.changelog.isancestorrev(self._rev, other._rev)
17626
3a524b647897 context: add "descendant()" to changectx for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17469
diff changeset
   776
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6763
diff changeset
   777
    def walk(self, match):
24646
5693c834bcb4 manifest: move changectx.walk() to manifests
Drew Gottlieb <drgott@google.com>
parents: 24633
diff changeset
   778
        '''Generates matching file names.'''
20292
8dc254198a8f changectx: increase perf of walk function
Durham Goode <durham@fb.com>
parents: 20236
diff changeset
   779
25435
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   780
        # Wrap match.bad method to have message with nodeid
24646
5693c834bcb4 manifest: move changectx.walk() to manifests
Drew Gottlieb <drgott@google.com>
parents: 24633
diff changeset
   781
        def bad(fn, msg):
25193
ccb1623266eb context: don't complain about a matcher's subrepo paths in changectx.walk()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24862
diff changeset
   782
            # The manifest doesn't know about subrepos, so don't complain about
ccb1623266eb context: don't complain about a matcher's subrepo paths in changectx.walk()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24862
diff changeset
   783
            # paths into valid subrepos.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   784
            if any(fn == s or fn.startswith(s + b'/') for s in self.substate):
25193
ccb1623266eb context: don't complain about a matcher's subrepo paths in changectx.walk()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24862
diff changeset
   785
                return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   786
            match.bad(fn, _(b'no such file in rev %s') % self)
20292
8dc254198a8f changectx: increase perf of walk function
Durham Goode <durham@fb.com>
parents: 20236
diff changeset
   787
40084
2cf18f46a1ce narrow: only walk files within narrowspec also for committed revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 40083
diff changeset
   788
        m = matchmod.badmatch(self._repo.narrowmatch(match), bad)
25435
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   789
        return self._manifest.walk(m)
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6763
diff changeset
   790
21985
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
   791
    def matches(self, match):
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
   792
        return self.walk(match)
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
   793
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   794
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   795
class basefilectx:
19572
c19f46b904b9 basefilectx: add an empty class that will be used as a parent of file contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19571
diff changeset
   796
    """A filecontext object represents the common logic for its children:
c19f46b904b9 basefilectx: add an empty class that will be used as a parent of file contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19571
diff changeset
   797
    filectx: read-only access to a filerevision that is already present
c19f46b904b9 basefilectx: add an empty class that will be used as a parent of file contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19571
diff changeset
   798
             in the repo,
c19f46b904b9 basefilectx: add an empty class that will be used as a parent of file contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19571
diff changeset
   799
    workingfilectx: a filecontext that represents files from the working
c19f46b904b9 basefilectx: add an empty class that will be used as a parent of file contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19571
diff changeset
   800
                    directory,
32243
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32242
diff changeset
   801
    memfilectx: a filecontext that represents files in-memory,
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32242
diff changeset
   802
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   803
19573
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   804
    @propertycache
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   805
    def _filelog(self):
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   806
        return self._repo.file(self._path)
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   807
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   808
    @propertycache
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   809
    def _changeid(self):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
   810
        if '_changectx' in self.__dict__:
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   811
            return self._changectx.rev()
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
   812
        elif '_descendantrev' in self.__dict__:
23983
ff070a53ee74 filectx: if we have a _descendantrev, use it to adjust linkrev
Matt Mackall <mpm@selenic.com>
parents: 23981
diff changeset
   813
            # this file context was created from a revision with a known
ff070a53ee74 filectx: if we have a _descendantrev, use it to adjust linkrev
Matt Mackall <mpm@selenic.com>
parents: 23981
diff changeset
   814
            # descendant, we can (lazily) correct for linkrev aliases
30275
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30270
diff changeset
   815
            return self._adjustlinkrev(self._descendantrev)
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   816
        else:
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   817
            return self._filelog.linkrev(self._filerev)
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   818
19575
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   819
    @propertycache
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   820
    def _filenode(self):
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
   821
        if '_fileid' in self.__dict__:
19575
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   822
            return self._filelog.lookup(self._fileid)
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   823
        else:
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   824
            return self._changectx.filenode(self._path)
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   825
19576
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   826
    @propertycache
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   827
    def _filerev(self):
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   828
        return self._filelog.rev(self._filenode)
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   829
19577
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   830
    @propertycache
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   831
    def _repopath(self):
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   832
        return self._path
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   833
19578
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   834
    def __nonzero__(self):
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   835
        try:
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   836
            self._filenode
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   837
            return True
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   838
        except error.LookupError:
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   839
            # file is missing
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   840
            return False
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   841
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
   842
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
   843
33022
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33019
diff changeset
   844
    def __bytes__(self):
30270
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   845
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   846
            return b"%s@%s" % (self.path(), self._changectx)
30270
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   847
        except error.LookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   848
            return b"%s@???" % self.path()
19579
964844d64ef8 basefilectx: move __str__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19578
diff changeset
   849
33022
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33019
diff changeset
   850
    __str__ = encoding.strmethod(__bytes__)
33019
daccadd75760 py3: define __bytes__ for basefilectx class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32904
diff changeset
   851
19580
e86a594ab11f basefilectx: move __repr__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19579
diff changeset
   852
    def __repr__(self):
43503
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43346
diff changeset
   853
        return "<%s %s>" % (type(self).__name__, str(self))
19580
e86a594ab11f basefilectx: move __repr__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19579
diff changeset
   854
19581
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   855
    def __hash__(self):
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   856
        try:
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   857
            return hash((self._path, self._filenode))
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   858
        except AttributeError:
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   859
            return id(self)
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   860
19582
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   861
    def __eq__(self, other):
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   862
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   863
            return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   864
                type(self) == type(other)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   865
                and self._path == other._path
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   866
                and self._filenode == other._filenode
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   867
            )
19582
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   868
        except AttributeError:
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   869
            return False
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   870
19583
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   871
    def __ne__(self, other):
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   872
        return not (self == other)
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   873
19584
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   874
    def filerev(self):
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   875
        return self._filerev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   876
19585
8e553cd6071e basefilectx: move filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19584
diff changeset
   877
    def filenode(self):
8e553cd6071e basefilectx: move filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19584
diff changeset
   878
        return self._filenode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   879
32238
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32148
diff changeset
   880
    @propertycache
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32148
diff changeset
   881
    def _flags(self):
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32148
diff changeset
   882
        return self._changectx.flags(self._path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   883
19586
43f9ed2f64b1 basefilectx: move flags from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19585
diff changeset
   884
    def flags(self):
32238
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32148
diff changeset
   885
        return self._flags
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   886
19587
b1c344ebd8e4 basefilectx: move filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19586
diff changeset
   887
    def filelog(self):
b1c344ebd8e4 basefilectx: move filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19586
diff changeset
   888
        return self._filelog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   889
19588
a192fff6c97d basefilectx: move rev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19587
diff changeset
   890
    def rev(self):
a192fff6c97d basefilectx: move rev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19587
diff changeset
   891
        return self._changeid
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   892
19589
6a9043fa06d0 basefilectx: move linkrev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19588
diff changeset
   893
    def linkrev(self):
6a9043fa06d0 basefilectx: move linkrev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19588
diff changeset
   894
        return self._filelog.linkrev(self._filerev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   895
19590
90994b176bc1 basefilectx: move node from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19589
diff changeset
   896
    def node(self):
90994b176bc1 basefilectx: move node from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19589
diff changeset
   897
        return self._changectx.node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   898
19591
04fbc85f870a basefilectx: move hex from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19590
diff changeset
   899
    def hex(self):
04fbc85f870a basefilectx: move hex from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19590
diff changeset
   900
        return self._changectx.hex()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   901
19592
1cdb3b3df4df basefilectx: move user from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19591
diff changeset
   902
    def user(self):
1cdb3b3df4df basefilectx: move user from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19591
diff changeset
   903
        return self._changectx.user()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   904
19593
e3c241c89350 basefilectx: move date from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19592
diff changeset
   905
    def date(self):
e3c241c89350 basefilectx: move date from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19592
diff changeset
   906
        return self._changectx.date()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   907
19594
1c030c24e196 basefilectx: move files from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19593
diff changeset
   908
    def files(self):
1c030c24e196 basefilectx: move files from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19593
diff changeset
   909
        return self._changectx.files()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   910
19595
bb6fd06975a6 basefilectx: move description from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19594
diff changeset
   911
    def description(self):
bb6fd06975a6 basefilectx: move description from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19594
diff changeset
   912
        return self._changectx.description()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   913
19596
9bc3d0dea371 basefilectx: move branch from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19595
diff changeset
   914
    def branch(self):
9bc3d0dea371 basefilectx: move branch from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19595
diff changeset
   915
        return self._changectx.branch()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   916
19597
837bc86370f0 basefilectx: move extra from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19596
diff changeset
   917
    def extra(self):
837bc86370f0 basefilectx: move extra from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19596
diff changeset
   918
        return self._changectx.extra()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   919
19598
e8ef893a3150 basefilectx: move phase from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19597
diff changeset
   920
    def phase(self):
e8ef893a3150 basefilectx: move phase from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19597
diff changeset
   921
        return self._changectx.phase()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   922
19599
66d83efac20a basefilectx: move phasestr from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19598
diff changeset
   923
    def phasestr(self):
66d83efac20a basefilectx: move phasestr from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19598
diff changeset
   924
        return self._changectx.phasestr()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   925
35088
a9454beb9dd8 context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 34926
diff changeset
   926
    def obsolete(self):
a9454beb9dd8 context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 34926
diff changeset
   927
        return self._changectx.obsolete()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   928
35093
bd2743936b56 context: add instabilities() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 35088
diff changeset
   929
    def instabilities(self):
bd2743936b56 context: add instabilities() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 35088
diff changeset
   930
        return self._changectx.instabilities()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   931
19600
12cdff44fdc4 basefilectx: move manifest from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19599
diff changeset
   932
    def manifest(self):
12cdff44fdc4 basefilectx: move manifest from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19599
diff changeset
   933
        return self._changectx.manifest()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   934
19601
f284907631f5 basefilectx: move changectx from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19600
diff changeset
   935
    def changectx(self):
f284907631f5 basefilectx: move changectx from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19600
diff changeset
   936
        return self._changectx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   937
32239
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32238
diff changeset
   938
    def renamed(self):
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32238
diff changeset
   939
        return self._copied
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   940
41768
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
   941
    def copysource(self):
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
   942
        return self._copied and self._copied[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   943
24333
5da0eb641881 filectx: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24326
diff changeset
   944
    def repo(self):
5da0eb641881 filectx: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24326
diff changeset
   945
        return self._repo
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   946
32240
842ea95d45dc filectx: move size to basefilectx
Jun Wu <quark@fb.com>
parents: 32239
diff changeset
   947
    def size(self):
842ea95d45dc filectx: move size to basefilectx
Jun Wu <quark@fb.com>
parents: 32239
diff changeset
   948
        return len(self.data())
19584
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   949
19602
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   950
    def path(self):
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   951
        return self._path
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   952
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   953
    def isbinary(self):
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   954
        try:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37066
diff changeset
   955
            return stringutil.binary(self.data())
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   956
        except IOError:
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   957
            return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   958
22054
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   959
    def isexec(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   960
        return b'x' in self.flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   961
22054
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   962
    def islink(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   963
        return b'l' in self.flags()
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   964
26978
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   965
    def isabsent(self):
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   966
        """whether this filectx represents a file not in self._changectx
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   967
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   968
        This is mainly for merge code to detect change/delete conflicts. This is
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   969
        expected to be True for all subclasses of basectx."""
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   970
        return False
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   971
26977
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   972
    _customcmp = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   973
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   974
    def cmp(self, fctx):
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   975
        """compare with other file context
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   976
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   977
        returns True if different than fctx.
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   978
        """
26977
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   979
        if fctx._customcmp:
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   980
            return fctx.cmp(self)
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   981
40991
21ffe6b97a25 context: error out if basefilectx.cmp() is called without self._filenode
Yuya Nishihara <yuya@tcha.org>
parents: 40990
diff changeset
   982
        if self._filenode is None:
21ffe6b97a25 context: error out if basefilectx.cmp() is called without self._filenode
Yuya Nishihara <yuya@tcha.org>
parents: 40990
diff changeset
   983
            raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   984
                b'filectx.cmp() must be reimplemented if not backed by revlog'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
   985
            )
40991
21ffe6b97a25 context: error out if basefilectx.cmp() is called without self._filenode
Yuya Nishihara <yuya@tcha.org>
parents: 40990
diff changeset
   986
40990
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
   987
        if fctx._filenode is None:
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
   988
            if self._repo._encodefilterpats:
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
   989
                # can't rely on size() because wdir content may be decoded
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
   990
                return self._filelog.cmp(self._filenode, fctx.data())
49012
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   991
            # filelog.size() has two special cases:
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   992
            # - censored metadata
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   993
            # - copy/rename tracking
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   994
            # The first is detected by peaking into the delta,
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   995
            # the second is detected by abusing parent order
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   996
            # in the revlog index as flag bit. This leaves files using
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   997
            # the dummy encoding and non-standard meta attributes.
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   998
            # The following check is a special case for the empty
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
   999
            # metadata block used if the raw file content starts with '\1\n'.
5b65721a75eb revlog: recommit 49fd21f32695 with a fix for issue6528
Joerg Sonnenberger <joerg@bec.de>
parents: 48946
diff changeset
  1000
            # Cases of arbitrary metadata flags are currently mishandled.
40990
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1001
            if self.size() - 4 == fctx.size():
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1002
                # size() can match:
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1003
                # if file data starts with '\1\n', empty metadata block is
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1004
                # prepended, which adds 4 bytes to filelog.size().
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1005
                return self._filelog.cmp(self._filenode, fctx.data())
46678
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1006
        if self.size() == fctx.size() or self.flags() == b'l':
40990
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1007
            # size() matches: need to compare content
46678
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1008
            # issue6456: Always compare symlinks because size can represent
0d055849d5f9 enclink: check contents of symlinks not just size in case of fcrypt
Corey Schuhen <cschuhen@topcon.com>
parents: 45942
diff changeset
  1009
            # encrypted string for EXT-4 encryption(fscrypt).
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
  1010
            return self._filelog.cmp(self._filenode, fctx.data())
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
  1011
40990
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40989
diff changeset
  1012
        # size() differs
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
  1013
        return True
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
  1014
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1015
    def _adjustlinkrev(self, srcrev, inclusive=False, stoprev=None):
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24050
diff changeset
  1016
        """return the first ancestor of <srcrev> introducing <fnode>
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1017
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1018
        If the linkrev of the file revision does not point to an ancestor of
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1019
        srcrev, we'll walk down the ancestors until we find one introducing
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1020
        this file revision.
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1021
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1022
        :srcrev: the changeset revision we search ancestors from
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1023
        :inclusive: if true, the src revision will also be checked
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1024
        :stoprev: an optional revision to stop the walk at. If no introduction
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1025
                  of this file content could be found before this floor
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1026
                  revision, the function will returns "None" and stops its
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1027
                  iteration.
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1028
        """
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1029
        repo = self._repo
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1030
        cl = repo.unfiltered().changelog
29939
80be4436e4cc manifest: adds manifestctx.readfast
Durham Goode <durham@fb.com>
parents: 29938
diff changeset
  1031
        mfl = repo.manifestlog
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1032
        # fetch the linkrev
30275
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30270
diff changeset
  1033
        lkr = self.linkrev()
40044
ccf4d808ec4c context: fast path linkrev adjustement in trivial case
Boris Feld <boris.feld@octobus.net>
parents: 39959
diff changeset
  1034
        if srcrev == lkr:
ccf4d808ec4c context: fast path linkrev adjustement in trivial case
Boris Feld <boris.feld@octobus.net>
parents: 39959
diff changeset
  1035
            return lkr
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1036
        # hack to reuse ancestor computation when searching for renames
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1037
        memberanc = getattr(self, '_ancestrycontext', None)
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1038
        iteranc = None
24411
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1039
        if srcrev is None:
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1040
            # wctx case, used by workingfilectx during mergecopy
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1041
            revs = [p.rev() for p in self._repo[None].parents()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1042
            inclusive = True  # we skipped the real (revless) source
24411
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1043
        else:
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1044
            revs = [srcrev]
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1045
        if memberanc is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1046
            memberanc = iteranc = cl.ancestors(revs, lkr, inclusive=inclusive)
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1047
        # check if this linkrev is an ancestor of srcrev
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1048
        if lkr not in memberanc:
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1049
            if iteranc is None:
24410
86de531e07e1 adjustlinkrev: prepare source revs for ancestry only once
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24407
diff changeset
  1050
                iteranc = cl.ancestors(revs, lkr, inclusive=inclusive)
30275
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30270
diff changeset
  1051
            fnode = self._filenode
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30270
diff changeset
  1052
            path = self._path
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1053
            for a in iteranc:
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1054
                if stoprev is not None and a < stoprev:
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1055
                    return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1056
                ac = cl.read(a)  # get changeset data (we avoid object creation)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1057
                if path in ac[3]:  # checking the 'files' field.
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1058
                    # The file has been touched, check if the content is
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1059
                    # similar to the one we search for.
29939
80be4436e4cc manifest: adds manifestctx.readfast
Durham Goode <durham@fb.com>
parents: 29938
diff changeset
  1060
                    if fnode == mfl[ac[0]].readfast().get(path):
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1061
                        return a
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1062
            # In theory, we should never get out of that loop without a result.
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1063
            # But if manifest uses a buggy file revision (not children of the
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1064
            # one it replaces) we could. Such a buggy situation will likely
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1065
            # result is crash somewhere else at to some point.
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1066
        return lkr
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1067
40694
8a0136f69027 context: introduce an `isintroducedafter` method and use it in copies
Boris Feld <boris.feld@octobus.net>
parents: 40693
diff changeset
  1068
    def isintroducedafter(self, changelogrev):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1069
        """True if a filectx has been introduced after a given floor revision"""
40696
69206452a2ac context: small refactoring of `isintroducedafter`
Boris Feld <boris.feld@octobus.net>
parents: 40695
diff changeset
  1070
        if self.linkrev() >= changelogrev:
69206452a2ac context: small refactoring of `isintroducedafter`
Boris Feld <boris.feld@octobus.net>
parents: 40695
diff changeset
  1071
            return True
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1072
        introrev = self._introrev(stoprev=changelogrev)
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1073
        if introrev is None:
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1074
            return False
40696
69206452a2ac context: small refactoring of `isintroducedafter`
Boris Feld <boris.feld@octobus.net>
parents: 40695
diff changeset
  1075
        return introrev >= changelogrev
40694
8a0136f69027 context: introduce an `isintroducedafter` method and use it in copies
Boris Feld <boris.feld@octobus.net>
parents: 40693
diff changeset
  1076
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1077
    def introrev(self):
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1078
        """return the rev of the changeset which introduced this file revision
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1079
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1080
        This method is different from linkrev because it take into account the
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1081
        changeset the filectx was created from. It ensures the returned
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1082
        revision is one of its ancestors. This prevents bugs from
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1083
        'linkrev-shadowing' when a file revision is used by multiple
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1084
        changesets.
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1085
        """
40695
9fa0d6dd1617 context: split `introrev` logic in a sub function
Boris Feld <boris.feld@octobus.net>
parents: 40694
diff changeset
  1086
        return self._introrev()
9fa0d6dd1617 context: split `introrev` logic in a sub function
Boris Feld <boris.feld@octobus.net>
parents: 40694
diff changeset
  1087
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1088
    def _introrev(self, stoprev=None):
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1089
        """
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1090
        Same as `introrev` but, with an extra argument to limit changelog
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1091
        iteration range in some internal usecase.
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1092
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1093
        If `stoprev` is set, the `introrev` will not be searched past that
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1094
        `stoprev` revision and "None" might be returned. This is useful to
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1095
        limit the iteration range.
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1096
        """
40692
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1097
        toprev = None
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1098
        attrs = vars(self)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
  1099
        if '_changeid' in attrs:
40692
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1100
            # We have a cached value already
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1101
            toprev = self._changeid
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
  1102
        elif '_changectx' in attrs:
40692
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1103
            # We know which changelog entry we are coming from
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1104
            toprev = self._changectx.rev()
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1105
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40671
diff changeset
  1106
        if toprev is not None:
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1107
            return self._adjustlinkrev(toprev, inclusive=True, stoprev=stoprev)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
  1108
        elif '_descendantrev' in attrs:
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1109
            introrev = self._adjustlinkrev(self._descendantrev, stoprev=stoprev)
40693
aee94f0a36cd context: take advantage of `_descendantrev` in introrev if available
Boris Feld <boris.feld@octobus.net>
parents: 40692
diff changeset
  1110
            # be nice and cache the result of the computation
40697
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1111
            if introrev is not None:
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40696
diff changeset
  1112
                self._changeid = introrev
40693
aee94f0a36cd context: take advantage of `_descendantrev` in introrev if available
Boris Feld <boris.feld@octobus.net>
parents: 40692
diff changeset
  1113
            return introrev
40046
50700a025953 context: reverse conditional branch order in introrev
Boris Feld <boris.feld@octobus.net>
parents: 40045
diff changeset
  1114
        else:
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1115
            return self.linkrev()
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1116
35271
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1117
    def introfilectx(self):
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1118
        """Return filectx having identical contents, but pointing to the
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1119
        changeset revision where this filectx was introduced"""
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1120
        introrev = self.introrev()
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1121
        if self.rev() == introrev:
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1122
            return self
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1123
        return self.filectx(self.filenode(), changeid=introrev)
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1124
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1125
    def _parentfilectx(self, path, fileid, filelog):
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1126
        """create parent filectx keeping ancestry info for _adjustlinkrev()"""
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1127
        fctx = filectx(self._repo, path, fileid=fileid, filelog=filelog)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
  1128
        if '_changeid' in vars(self) or '_changectx' in vars(self):
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1129
            # If self is associated with a changeset (probably explicitly
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1130
            # fed), ensure the created filectx is associated with a
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1131
            # changeset that is an ancestor of self.changectx.
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1132
            # This lets us later use _adjustlinkrev to get a correct link.
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1133
            fctx._descendantrev = self.rev()
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1134
            fctx._ancestrycontext = getattr(self, '_ancestrycontext', None)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
  1135
        elif '_descendantrev' in vars(self):
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1136
            # Otherwise propagate _descendantrev if we have one associated.
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1137
            fctx._descendantrev = self._descendantrev
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1138
            fctx._ancestrycontext = getattr(self, '_ancestrycontext', None)
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1139
        return fctx
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1140
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1141
    def parents(self):
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 22192
diff changeset
  1142
        _path = self._path
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1143
        fl = self._filelog
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1144
        parents = self._filelog.parents(self._filenode)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1145
        pl = [
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1146
            (_path, node, fl)
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1147
            for node in parents
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1148
            if node != self._repo.nodeconstants.nullid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1149
        ]
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1150
23702
c48924787eaa filectx.parents: enforce changeid of parent to be in own changectx ancestors
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23701
diff changeset
  1151
        r = fl.renamed(self._filenode)
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1152
        if r:
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1153
            # - In the simple rename case, both parent are nullid, pl is empty.
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1154
            # - In case of merge, only one of the parent is null id and should
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1155
            # be replaced with the rename information. This parent is -always-
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1156
            # the first one.
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1157
            #
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24050
diff changeset
  1158
            # As null id have always been filtered out in the previous list
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1159
            # comprehension, inserting to 0 will always result in "replacing
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1160
            # first nullid parent with rename information.
23699
fe17a6fb220d filectx.parents: also fetch the filelog of rename source too
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23688
diff changeset
  1161
            pl.insert(0, (r[0], r[1], self._repo.file(r[0])))
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1162
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1163
        return [self._parentfilectx(path, fnode, l) for path, fnode, l in pl]
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1164
19606
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
  1165
    def p1(self):
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
  1166
        return self.parents()[0]
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
  1167
19607
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1168
    def p2(self):
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1169
        p = self.parents()
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1170
        if len(p) == 2:
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1171
            return p[1]
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1172
        return filectx(self._repo, self._path, fileid=-1, filelog=self._filelog)
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1173
37065
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36918
diff changeset
  1174
    def annotate(self, follow=False, skiprevs=None, diffopts=None):
37066
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
  1175
        """Returns a list of annotateline objects for each line in the file
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
  1176
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
  1177
        - line.fctx is the filectx of the node where that line was last changed
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
  1178
        - line.lineno is the line number at the first appearance in the managed
37065
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36918
diff changeset
  1179
          file
37066
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
  1180
        - line.text is the data on that line (including newline character)
37065
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36918
diff changeset
  1181
        """
9097
431462bd8478 fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
  1182
        getlog = util.lrucachefunc(lambda x: self._repo.file(x))
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1183
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1184
        def parents(f):
24862
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1185
            # Cut _descendantrev here to mitigate the penalty of lazy linkrev
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1186
            # adjustment. Otherwise, p._adjustlinkrev() would walk changelog
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1187
            # from the topmost introrev (= srcrev) down to p.linkrev() if it
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1188
            # isn't an ancestor of the srcrev.
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1189
            f._changeid
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1190
            pl = f.parents()
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1191
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1192
            # Don't return renamed parents if we aren't following.
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1193
            if not follow:
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1194
                pl = [p for p in pl if p.path() == f.path()]
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1195
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1196
            # renamed filectx won't have a filelog yet, so set it
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1197
            # from the cache to save time
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1198
            for p in pl:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43503
diff changeset
  1199
                if not '_filelog' in p.__dict__:
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1200
                    p._filelog = getlog(p.path())
3146
e69a0cbe268e filectx.annotate: return filectx for each line instead of rev
Brendan Cully <brendan@kublai.com>
parents: 3144
diff changeset
  1201
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1202
            return pl
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1203
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1204
        # use linkrev to find the first changeset where self appeared
35271
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1205
        base = self.introfilectx()
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1206
        if getattr(base, '_ancestrycontext', None) is None:
44108
c472970339d2 changectx: use unfiltered changelog to walk ancestors in annotate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
  1207
            # it is safe to use an unfiltered repository here because we are
c472970339d2 changectx: use unfiltered changelog to walk ancestors in annotate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
  1208
            # walking ancestors only.
c472970339d2 changectx: use unfiltered changelog to walk ancestors in annotate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44104
diff changeset
  1209
            cl = self._repo.unfiltered().changelog
35271
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1210
            if base.rev() is None:
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1211
                # wctx is not inclusive, but works because _ancestrycontext
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1212
                # is used to test filelog revisions
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1213
                ac = cl.ancestors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1214
                    [p.rev() for p in base.parents()], inclusive=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1215
                )
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1216
            else:
35271
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35107
diff changeset
  1217
                ac = cl.ancestors([base.rev()], inclusive=True)
24407
dd01834a696f annotate: reuse ancestry context when adjusting linkrev (issue4532)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23984
diff changeset
  1218
            base._ancestrycontext = ac
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1219
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1220
        return dagop.annotate(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1221
            base, parents, skiprevs=skiprevs, diffopts=diffopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1222
        )
3124
4d021b91cb26 filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents: 3123
diff changeset
  1223
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1224
    def ancestors(self, followfirst=False):
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1225
        visit = {}
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1226
        c = self
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1227
        if followfirst:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1228
            cut = 1
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1229
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1230
            cut = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1231
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1232
        while True:
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1233
            for parent in c.parents()[:cut]:
23981
24b57c3899f8 filectx: use linkrev to sort ancestors
Matt Mackall <mpm@selenic.com>
parents: 23980
diff changeset
  1234
                visit[(parent.linkrev(), parent.filenode())] = parent
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1235
            if not visit:
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1236
                break
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1237
            c = visit.pop(max(visit))
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1238
            yield c
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1239
33901
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1240
    def decodeddata(self):
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1241
        """Returns `data()` after running repository decoding filters.
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1242
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1243
        This is often equivalent to how the data would be expressed on disk.
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1244
        """
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1245
        return self._repo.wwritedata(self.path(), self.data())
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33797
diff changeset
  1246
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1247
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1248
class filectx(basefilectx):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1249
    """A filecontext object makes access to data related to a particular
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1250
    filerevision convenient."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1251
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1252
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1253
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1254
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1255
        path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1256
        changeid=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1257
        fileid=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1258
        filelog=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1259
        changectx=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1260
    ):
40062
b6c2543e1dd8 filectx: correct docstring about "changeid"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40061
diff changeset
  1261
        """changeid must be a revision number, if specified.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1262
        fileid can be a file revision or node."""
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1263
        self._repo = repo
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1264
        self._path = path
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1265
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1266
        assert (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1267
            changeid is not None or fileid is not None or changectx is not None
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1268
        ), b"bad args: changeid=%r, fileid=%r, changectx=%r" % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1269
            changeid,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1270
            fileid,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1271
            changectx,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1272
        )
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1273
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1274
        if filelog is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1275
            self._filelog = filelog
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1276
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1277
        if changeid is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1278
            self._changeid = changeid
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1279
        if changectx is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1280
            self._changectx = changectx
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1281
        if fileid is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1282
            self._fileid = fileid
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1283
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1284
    @propertycache
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1285
    def _changectx(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1286
        try:
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
  1287
            return self._repo[self._changeid]
23687
8f32dcfbc338 context: catch FilteredRepoLookupError instead of RepoLookupError
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23616
diff changeset
  1288
        except error.FilteredRepoLookupError:
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1289
            # Linkrev may point to any revision in the repository.  When the
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1290
            # repository is filtered this may lead to `filectx` trying to build
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1291
            # `changectx` for filtered revision. In such case we fallback to
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1292
            # creating `changectx` on the unfiltered version of the reposition.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1293
            # This fallback should not be an issue because `changectx` from
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1294
            # `filectx` are not used in complex operations that care about
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1295
            # filtering.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1296
            #
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1297
            # This fallback is a cheap and dirty fix that prevent several
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1298
            # crashes. It does not ensure the behavior is correct. However the
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1299
            # behavior was not correct before filtering either and "incorrect
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1300
            # behavior" is seen as better as "crash"
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1301
            #
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1302
            # Linkrevs have several serious troubles with filtering that are
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1303
            # complicated to solve. Proper handling of the issue here should be
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1304
            # considered when solving linkrev issue are on the table.
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
  1305
            return self._repo.unfiltered()[self._changeid]
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1306
23770
50f0096a7346 filectx: fix annotate to not directly instantiate filectx
Durham Goode <durham@fb.com>
parents: 23757
diff changeset
  1307
    def filectx(self, fileid, changeid=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1308
        """opens an arbitrary revision of the file without
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  1309
        opening a new filelog"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1310
        return filectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1311
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1312
            self._path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1313
            fileid=fileid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1314
            filelog=self._filelog,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1315
            changeid=changeid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1316
        )
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1317
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30718
diff changeset
  1318
    def rawdata(self):
42769
e75981b7ce84 rawdata: update callers in context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42711
diff changeset
  1319
        return self._filelog.rawdata(self._filenode)
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30718
diff changeset
  1320
32241
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32240
diff changeset
  1321
    def rawflags(self):
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32240
diff changeset
  1322
        """low-level revlog flags"""
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32240
diff changeset
  1323
        return self._filelog.flags(self._filerev)
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32240
diff changeset
  1324
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1325
    def data(self):
22932
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1326
        try:
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1327
            return self._filelog.read(self._filenode)
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1328
        except error.CensoredNodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1329
            if self._repo.ui.config(b"censor", b"policy") == b"ignore":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1330
                return b""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1331
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1332
                _(b"censored node: %s") % short(self._filenode),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1333
                hint=_(b"set censor.policy to ignore errors"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1334
            )
22932
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1335
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1336
    def size(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1337
        return self._filelog.size(self._filerev)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1338
32239
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32238
diff changeset
  1339
    @propertycache
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32238
diff changeset
  1340
    def _copied(self):
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1341
        """check if file was actually renamed in this changeset revision
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1342
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1343
        If rename logged in file revision, we report copy for changeset only
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1344
        if file revisions linkrev points back to the changeset in question
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1345
        or both changeset parents contain different file revisions.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1346
        """
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1347
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1348
        renamed = self._filelog.renamed(self._filenode)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1349
        if not renamed:
39710
7375a9ab0149 filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents: 39576
diff changeset
  1350
            return None
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1351
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1352
        if self.rev() == self.linkrev():
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1353
            return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1354
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1355
        name = self.path()
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1356
        fnode = self._filenode
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1357
        for p in self._changectx.parents():
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1358
            try:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1359
                if fnode == p.filenode(name):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1360
                    return None
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1361
            except error.LookupError:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1362
                pass
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1363
        return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1364
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1365
    def children(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1366
        # hard for renames
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1367
        c = self._filelog.children(self._filenode)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1368
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1369
            filectx(self._repo, self._path, fileid=x, filelog=self._filelog)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1370
            for x in c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1371
        ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1372
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1373
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1374
class committablectx(basectx):
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1375
    """A committablectx object provides common functionality for a context that
19664
61dcb2aa7378 commitablectx: add a class that will be used as a parent of mutable contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19663
diff changeset
  1376
    wants the ability to commit, e.g. workingctx or memctx."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1377
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1378
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1379
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1380
        repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1381
        text=b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1382
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1383
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1384
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1385
        changes=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1386
        branch=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1387
    ):
37175
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37174
diff changeset
  1388
        super(committablectx, self).__init__(repo)
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1389
        self._rev = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1390
        self._node = None
6709
f84f507c53d3 context: let workingctx.date(), .user() and description() be overriden
Patrick Mezard <pmezard@gmail.com>
parents: 6708
diff changeset
  1391
        self._text = text
6718
4386a7706828 Fix commit date (issue1193)
Christian Ebert <blacktrash@gmx.net>
parents: 6715
diff changeset
  1392
        if date:
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36411
diff changeset
  1393
            self._date = dateutil.parsedate(date)
6817
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6809
diff changeset
  1394
        if user:
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6809
diff changeset
  1395
            self._user = user
6707
02bad34230a2 localrepo: hide commit() file selection behind workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
  1396
        if changes:
21592
16f62b4203b1 committablectx: simplify caching the status
Sean Farley <sean.michael.farley@gmail.com>
parents: 21590
diff changeset
  1397
            self._status = changes
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1398
6708
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1399
        self._extra = {}
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1400
        if extra:
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1401
            self._extra = extra.copy()
42296
df2f22befdc8 context: let caller pass in branch to committablectx.__init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 42295
diff changeset
  1402
        if branch is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1403
            self._extra[b'branch'] = encoding.fromlocal(branch)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1404
        if not self._extra.get(b'branch'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1405
            self._extra[b'branch'] = b'default'
6708
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1406
32643
1df98fc923d4 py3: implement __bytes__ for committablectx
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32613
diff changeset
  1407
    def __bytes__(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1408
        return bytes(self._parents[0]) + b"+"
19666
09459edfb48b commitablectx: move __str__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19665
diff changeset
  1409
47191
b338d831d18c templates: fix `revset('parents()') % ...` in amend message template
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1410
    def hex(self):
b338d831d18c templates: fix `revset('parents()') % ...` in amend message template
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1411
        self._repo.nodeconstants.wdirhex
b338d831d18c templates: fix `revset('parents()') % ...` in amend message template
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
  1412
33022
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33019
diff changeset
  1413
    __str__ = encoding.strmethod(__bytes__)
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33019
diff changeset
  1414
19667
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1415
    def __nonzero__(self):
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1416
        return True
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1417
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
  1418
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
  1419
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1420
    @propertycache
19672
375986c02539 commitablectx: move _status from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19671
diff changeset
  1421
    def _status(self):
21592
16f62b4203b1 committablectx: simplify caching the status
Sean Farley <sean.michael.farley@gmail.com>
parents: 21590
diff changeset
  1422
        return self._repo.status()
19672
375986c02539 commitablectx: move _status from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19671
diff changeset
  1423
19674
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1424
    @propertycache
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1425
    def _user(self):
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1426
        return self._repo.ui.username()
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1427
19676
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1428
    @propertycache
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1429
    def _date(self):
32409
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32401
diff changeset
  1430
        ui = self._repo.ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1431
        date = ui.configdate(b'devel', b'default-date')
32409
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32401
diff changeset
  1432
        if date is None:
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36411
diff changeset
  1433
            date = dateutil.makedate()
32409
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32401
diff changeset
  1434
        return date
19676
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1435
21587
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1436
    def subrev(self, subpath):
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1437
        return None
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1438
24719
11e8fec00234 committablectx: override manifestnode() to return None
Yuya Nishihara <yuya@tcha.org>
parents: 24646
diff changeset
  1439
    def manifestnode(self):
11e8fec00234 committablectx: override manifestnode() to return None
Yuya Nishihara <yuya@tcha.org>
parents: 24646
diff changeset
  1440
        return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1441
19675
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1442
    def user(self):
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1443
        return self._user or self._repo.ui.username()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1444
19677
e11415510352 commitablectx: move date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19676
diff changeset
  1445
    def date(self):
e11415510352 commitablectx: move date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19676
diff changeset
  1446
        return self._date
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1447
19678
897c2dbc0256 commitablectx: move description from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19677
diff changeset
  1448
    def description(self):
897c2dbc0256 commitablectx: move description from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19677
diff changeset
  1449
        return self._text
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1450
19679
f21804f1582e commitablectx: move files from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19678
diff changeset
  1451
    def files(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1452
        return sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1453
            self._status.modified + self._status.added + self._status.removed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1454
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1455
41789
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1456
    def modified(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1457
        return self._status.modified
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1458
41789
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1459
    def added(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1460
        return self._status.added
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1461
41789
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1462
    def removed(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1463
        return self._status.removed
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1464
41789
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1465
    def deleted(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41776
diff changeset
  1466
        return self._status.deleted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1467
42374
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1468
    filesmodified = modified
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1469
    filesadded = added
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1470
    filesremoved = removed
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1471
19687
54b3b4821bfb commitablectx: move branch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19686
diff changeset
  1472
    def branch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1473
        return encoding.tolocal(self._extra[b'branch'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1474
19688
21e1068109a7 commitablectx: move closesbranch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19687
diff changeset
  1475
    def closesbranch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1476
        return b'close' in self._extra
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1477
19689
8dbb66f339f3 commitablectx: move extra from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19688
diff changeset
  1478
    def extra(self):
8dbb66f339f3 commitablectx: move extra from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19688
diff changeset
  1479
        return self._extra
19680
fc33fcfa08f2 commitablectx: move modified from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19679
diff changeset
  1480
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1481
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1482
        return False
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1483
19690
65ff9fd67d8d commitablectx: move tags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19689
diff changeset
  1484
    def tags(self):
25688
24cda1dd45ff workingctx: don't report the tags for its parents
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1485
        return []
19690
65ff9fd67d8d commitablectx: move tags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19689
diff changeset
  1486
19691
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1487
    def bookmarks(self):
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1488
        b = []
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1489
        for p in self.parents():
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1490
            b.extend(p.bookmarks())
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1491
        return b
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1492
19692
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1493
    def phase(self):
43963
bbcf78c4ff90 commitablectx: fix the default phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43787
diff changeset
  1494
        phase = phases.newcommitphase(self._repo.ui)
19692
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1495
        for p in self.parents():
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1496
            phase = max(phase, p.phase())
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1497
        return phase
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1498
19693
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1499
    def hidden(self):
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1500
        return False
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1501
19694
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1502
    def children(self):
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1503
        return []
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1504
44912
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1505
    def flags(self, path):
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1506
        if '_manifest' in self.__dict__:
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1507
            try:
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1508
                return self._manifest.flags(path)
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1509
            except KeyError:
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1510
                return b''
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1511
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1512
        try:
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1513
            return self._flagfunc(path)
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1514
        except OSError:
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1515
            return b''
4234c9af515d flags: read flag from dirstate/disk for workingcopyctx (issue5743)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44365
diff changeset
  1516
19696
210cc42a8ac2 commitablectx: move ancestor from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19695
diff changeset
  1517
    def ancestor(self, c2):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
  1518
        """return the "best" ancestor context of self and c2"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1519
        return self._parents[0].ancestor(c2)  # punt on two parents for now
19696
210cc42a8ac2 commitablectx: move ancestor from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19695
diff changeset
  1520
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1521
    def ancestors(self):
23616
11a160547d7f context: return dirstate parents in workingctx.ancestors()
Durham Goode <durham@fb.com>
parents: 23603
diff changeset
  1522
        for p in self._parents:
11a160547d7f context: return dirstate parents in workingctx.ancestors()
Durham Goode <durham@fb.com>
parents: 23603
diff changeset
  1523
            yield p
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1524
        for a in self._repo.changelog.ancestors(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1525
            [p.rev() for p in self._parents]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1526
        ):
39957
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39907
diff changeset
  1527
            yield self._repo[a]
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1528
19699
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1529
    def markcommitted(self, node):
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1530
        """Perform post-commit cleanup necessary after committing this ctx
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1531
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1532
        Specifically, this updates backing stores this working context
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1533
        wraps to reflect the fact that the changes reflected by this
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1534
        workingctx have been committed.  For example, it marks
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1535
        modified and added files as normal in the dirstate.
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1536
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1537
        """
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1538
32610
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32609
diff changeset
  1539
    def dirty(self, missing=False, merge=True, branch=True):
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32609
diff changeset
  1540
        return False
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32609
diff changeset
  1541
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1542
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1543
class workingctx(committablectx):
19671
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1544
    """A workingctx object makes access to data related to
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1545
    the current working directory convenient.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1546
    date - any valid date string or (unixtime, offset), or None.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1547
    user - username string, or None.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1548
    extra - a dictionary of extra values, or None.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1549
    changes - a list of file lists as returned by localrepo.status()
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1550
               or None to use the repository status.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1551
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1552
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1553
    def __init__(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1554
        self, repo, text=b"", user=None, date=None, extra=None, changes=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1555
    ):
42297
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42296
diff changeset
  1556
        branch = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1557
        if not extra or b'branch' not in extra:
42297
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42296
diff changeset
  1558
            try:
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42296
diff changeset
  1559
                branch = repo.dirstate.branch()
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42296
diff changeset
  1560
            except UnicodeDecodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1561
                raise error.Abort(_(b'branch name not in UTF-8!'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1562
        super(workingctx, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1563
            repo, text, user, date, extra, changes, branch=branch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1564
        )
19671
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1565
14129
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1566
    def __iter__(self):
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1567
        d = self._repo.dirstate
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1568
        for f in d:
48094
3fe500d15e7c dirstate-item: use `tracked` instead of the `state` in context's iter
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48093
diff changeset
  1569
            if d.get_entry(f).tracked:
14129
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1570
                yield f
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1571
21845
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1572
    def __contains__(self, key):
48093
5437a0254590 dirstate-item: use `tracked` instead of the `state` in context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47745
diff changeset
  1573
        return self._repo.dirstate.get_entry(key).tracked
21845
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1574
25590
183965a00c76 context: override workingctx.hex() to avoid a crash
Matt Harbison <matt_harbison@yahoo.com>
parents: 25465
diff changeset
  1575
    def hex(self):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1576
        return self._repo.nodeconstants.wdirhex
25590
183965a00c76 context: override workingctx.hex() to avoid a crash
Matt Harbison <matt_harbison@yahoo.com>
parents: 25465
diff changeset
  1577
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1578
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1579
    def _parents(self):
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1580
        p = self._repo.dirstate.parents()
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1581
        if p[1] == self._repo.nodeconstants.nullid:
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1582
            p = p[:-1]
39959
43d3b09b3e5a repo: move unfiltered-repo optimization to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 39958
diff changeset
  1583
        # use unfiltered repo to delay/avoid loading obsmarkers
43d3b09b3e5a repo: move unfiltered-repo optimization to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 39958
diff changeset
  1584
        unfi = self._repo.unfiltered()
43767
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43764
diff changeset
  1585
        return [
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43764
diff changeset
  1586
            changectx(
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43764
diff changeset
  1587
                self._repo, unfi.changelog.rev(n), n, maybe_filtered=False
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43764
diff changeset
  1588
            )
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43764
diff changeset
  1589
            for n in p
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43764
diff changeset
  1590
        ]
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1591
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1592
    def setparents(self, p1node, p2node=None):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1593
        if p2node is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1594
            p2node = self._repo.nodeconstants.nullid
44052
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1595
        dirstate = self._repo.dirstate
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
  1596
        with dirstate.changing_parents(self._repo):
44052
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1597
            copies = dirstate.setparents(p1node, p2node)
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1598
            pctx = self._repo[p1node]
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1599
            if copies:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1600
                # Adjust copy records, the dirstate cannot do it, it
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1601
                # requires access to parents manifests. Preserve them
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1602
                # only for entries added to first parent.
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1603
                for f in copies:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1604
                    if f not in pctx and copies[f] in pctx:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1605
                        dirstate.copy(copies[f], f)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1606
            if p2node == self._repo.nodeconstants.nullid:
44052
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1607
                for f, s in sorted(dirstate.copies().items()):
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1608
                    if f not in pctx and s not in pctx:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1609
                        dirstate.copy(None, f)
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1610
37447
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1611
    def _fileinfo(self, path):
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1612
        # populate __dict__['_manifest'] as workingctx has no _manifestdelta
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1613
        self._manifest
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1614
        return super(workingctx, self)._fileinfo(path)
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1615
42292
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1616
    def _buildflagfunc(self):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1617
        # Create a fallback function for getting file flags when the
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1618
        # filesystem doesn't support them
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1619
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1620
        copiesget = self._repo.dirstate.copies().get
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1621
        parents = self.parents()
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1622
        if len(parents) < 2:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1623
            # when we have one parent, it's easy: copy from parent
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1624
            man = parents[0].manifest()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1625
42292
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1626
            def func(f):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1627
                f = copiesget(f, f)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1628
                return man.flags(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1629
42292
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1630
        else:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1631
            # merges are tricky: we try to reconstruct the unstored
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1632
            # result from the merge (issue1802)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1633
            p1, p2 = parents
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1634
            pa = p1.ancestor(p2)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1635
            m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1636
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1637
            def func(f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1638
                f = copiesget(f, f)  # may be wrong for merges with copies
42292
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1639
                fl1, fl2, fla = m1.flags(f), m2.flags(f), ma.flags(f)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1640
                if fl1 == fl2:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1641
                    return fl1
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1642
                if fl1 == fla:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1643
                    return fl2
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1644
                if fl2 == fla:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1645
                    return fl1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1646
                return b''  # punt for conflicts
42292
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1647
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1648
        return func
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1649
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1650
    @propertycache
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1651
    def _flagfunc(self):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1652
        return self._repo.dirstate.flagfunc(self._buildflagfunc)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1653
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1654
    def flags(self, path):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1655
        try:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1656
            return self._flagfunc(path)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1657
        except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1658
            return b''
42292
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42291
diff changeset
  1659
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
  1660
    def filectx(self, path, filelog=None):
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1661
        """get a file context from the working directory"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1662
        return workingfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1663
            self._repo, path, workingctx=self, filelog=filelog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1664
        )
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1665
16491
bfe89d65d651 update: make --check abort with dirty subrepos
Patrick Mezard <patrick@mezard.eu>
parents: 16410
diff changeset
  1666
    def dirty(self, missing=False, merge=True, branch=True):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43767
diff changeset
  1667
        """check whether a working directory is modified"""
11110
22f5ad0b5857 subrepo: dirtiness checks should iterate over subrepos
Edouard Gomez <ed.gomez@free.fr>
parents: 11106
diff changeset
  1668
        # check subrepos first
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18252
diff changeset
  1669
        for s in sorted(self.substate):
33364
bf2daeddd42b subrepo: consider the parent repo dirty when a file is missing
Matt Harbison <matt_harbison@yahoo.com>
parents: 33353
diff changeset
  1670
            if self.sub(s).dirty(missing=missing):
11110
22f5ad0b5857 subrepo: dirtiness checks should iterate over subrepos
Edouard Gomez <ed.gomez@free.fr>
parents: 11106
diff changeset
  1671
                return True
22f5ad0b5857 subrepo: dirtiness checks should iterate over subrepos
Edouard Gomez <ed.gomez@free.fr>
parents: 11106
diff changeset
  1672
        # check current working dir
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1673
        return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1674
            (merge and self.p2())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1675
            or (branch and self.branch() != self.p1().branch())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1676
            or self.modified()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1677
            or self.added()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1678
            or self.removed()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1679
            or (missing and self.deleted())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1680
        )
8717
e8de59577257 context: add a dirty method to detect modified contexts
Matt Mackall <mpm@selenic.com>
parents: 8528
diff changeset
  1681
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1682
    def add(self, list, prefix=b""):
27809
37a75d69eb43 with: use context manager for wlock in workingctx.add
Bryan O'Sullivan <bryano@fb.com>
parents: 27749
diff changeset
  1683
        with self._repo.wlock():
37a75d69eb43 with: use context manager for wlock in workingctx.add
Bryan O'Sullivan <bryano@fb.com>
parents: 27749
diff changeset
  1684
            ui, ds = self._repo.ui, self._repo.dirstate
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1685
            uipath = lambda f: ds.pathto(pathutil.join(prefix, f))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1686
            rejected = []
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1687
            lstat = self._repo.wvfs.lstat
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1688
            for f in list:
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1689
                # ds.pathto() returns an absolute file when this is invoked from
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1690
                # the keyword extension.  That gets flagged as non-portable on
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1691
                # Windows, since it contains the drive letter and colon.
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1692
                scmutil.checkportable(ui, os.path.join(prefix, f))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1693
                try:
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1694
                    st = lstat(f)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13962
diff changeset
  1695
                except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1696
                    ui.warn(_(b"%s does not exist!\n") % uipath(f))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1697
                    rejected.append(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1698
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1699
                limit = ui.configbytes(b'ui', b'large-file-limit')
38600
a936d1368fc5 ui: make the large file warning limit fully configurable
Joerg Sonnenberger <joerg@bec.de>
parents: 38589
diff changeset
  1700
                if limit != 0 and st.st_size > limit:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1701
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1702
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1703
                            b"%s: up to %d MB of RAM may be required "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1704
                            b"to manage this file\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1705
                            b"(use 'hg revert %s' to cancel the "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1706
                            b"pending addition)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1707
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1708
                        % (f, 3 * st.st_size // 1000000, uipath(f))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1709
                    )
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1710
                if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1711
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1712
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1713
                            b"%s not added: only files and symlinks "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1714
                            b"supported currently\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1715
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1716
                        % uipath(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1717
                    )
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1718
                    rejected.append(f)
47594
0cef28b121a4 context: use `dirstate.set_tracked` in `context.add`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47350
diff changeset
  1719
                elif not ds.set_tracked(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1720
                    ui.warn(_(b"%s already tracked!\n") % uipath(f))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1721
            return rejected
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1722
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1723
    def forget(self, files, prefix=b""):
27810
8c81975fe145 with: use context manager for wlock in workingctx.forget
Bryan O'Sullivan <bryano@fb.com>
parents: 27809
diff changeset
  1724
        with self._repo.wlock():
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1725
            ds = self._repo.dirstate
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1726
            uipath = lambda f: ds.pathto(pathutil.join(prefix, f))
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15895
diff changeset
  1727
            rejected = []
14435
5f6090e559fa context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents: 14434
diff changeset
  1728
            for f in files:
47600
f636dfe83554 context: use `dirstate.set_untracked` in `context.forget`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47595
diff changeset
  1729
                if not ds.set_untracked(f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1730
                    self._repo.ui.warn(_(b"%s not tracked!\n") % uipath(f))
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15895
diff changeset
  1731
                    rejected.append(f)
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15895
diff changeset
  1732
            return rejected
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1733
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1734
    def copy(self, source, dest):
19902
12a8bdd97b4f context: use "vfs.lstat()" to examine target path instead of "os.path.*"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19901
diff changeset
  1735
        try:
12a8bdd97b4f context: use "vfs.lstat()" to examine target path instead of "os.path.*"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19901
diff changeset
  1736
            st = self._repo.wvfs.lstat(dest)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
  1737
        except FileNotFoundError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1738
            self._repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1739
                _(b"%s does not exist!\n") % self._repo.dirstate.pathto(dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1740
            )
19902
12a8bdd97b4f context: use "vfs.lstat()" to examine target path instead of "os.path.*"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19901
diff changeset
  1741
            return
12a8bdd97b4f context: use "vfs.lstat()" to examine target path instead of "os.path.*"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19901
diff changeset
  1742
        if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1743
            self._repo.ui.warn(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1744
                _(b"copy failed: %s is not a file or a symbolic link\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1745
                % self._repo.dirstate.pathto(dest)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1746
            )
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1747
        else:
27812
28d0c0ef327b with: use context manager for wlock in copy
Bryan O'Sullivan <bryano@fb.com>
parents: 27811
diff changeset
  1748
            with self._repo.wlock():
41612
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41611
diff changeset
  1749
                ds = self._repo.dirstate
47595
14e2f4bd5f16 context: use `dirstate.set_tracked` in context.copy
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47594
diff changeset
  1750
                ds.set_tracked(dest)
41612
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41611
diff changeset
  1751
                ds.copy(source, dest)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1752
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1753
    def match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1754
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1755
        pats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1756
        include=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1757
        exclude=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1758
        default=b'glob',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1759
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1760
        badfn=None,
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
  1761
        cwd=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1762
    ):
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1763
        r = self._repo
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
  1764
        if not cwd:
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
  1765
            cwd = r.getcwd()
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1766
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1767
        # Only a case insensitive filesystem needs magic to translate user input
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1768
        # to actual case in the filesystem.
32401
284b18303f61 match: replace icasefsmatch() function by flag to regular match()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32395
diff changeset
  1769
        icasefs = not util.fscasesensitive(r.root)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1770
        return matchmod.match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1771
            r.root,
44009
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43963
diff changeset
  1772
            cwd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1773
            pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1774
            include,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1775
            exclude,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1776
            default,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1777
            auditor=r.auditor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1778
            ctx=self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1779
            listsubrepos=listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1780
            badfn=badfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1781
            icasefs=icasefs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1782
        )
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1783
21393
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1784
    def _filtersuspectsymlink(self, files):
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1785
        if not files or self._repo.dirstate._checklink:
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1786
            return files
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1787
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1788
        # Symlink placeholders may get non-symlink-like contents
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1789
        # via user error or dereferencing by NFS or Samba servers,
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1790
        # so we filter out any placeholders that don't look like a
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1791
        # symlink
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1792
        sane = []
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1793
        for f in files:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1794
            if self.flags(f) == b'l':
21393
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1795
                d = self[f].data()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1796
                if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1797
                    d == b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1798
                    or len(d) >= 1024
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1799
                    or b'\n' in d
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1800
                    or stringutil.binary(d)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1801
                ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1802
                    self._repo.ui.debug(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
  1803
                        b'ignoring suspect symlink placeholder "%s"\n' % f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1804
                    )
21393
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1805
                    continue
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1806
            sane.append(f)
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1807
        return sane
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1808
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1809
    def _checklookup(self, files, mtime_boundary):
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1810
        # check for any possibly clean files
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1811
        if not files:
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1812
            return [], [], [], []
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1813
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1814
        modified = []
32651
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1815
        deleted = []
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1816
        clean = []
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1817
        fixup = []
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1818
        pctx = self._parents[0]
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1819
        # do a full compare of any files that might have changed
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1820
        for f in sorted(files):
32651
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1821
            try:
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1822
                # This will return True for a file that got replaced by a
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1823
                # directory in the interim, but fixing that is pretty hard.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1824
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1825
                    f not in pctx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1826
                    or self.flags(f) != pctx.flags(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1827
                    or pctx[f].cmp(self[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1828
                ):
32651
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1829
                    modified.append(f)
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1830
                elif mtime_boundary is None:
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1831
                    clean.append(f)
32651
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1832
                else:
48381
41f40f35278a status: gather fixup info at comparison time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48095
diff changeset
  1833
                    s = self[f].lstat()
41f40f35278a status: gather fixup info at comparison time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48095
diff changeset
  1834
                    mode = s.st_mode
41f40f35278a status: gather fixup info at comparison time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48095
diff changeset
  1835
                    size = s.st_size
48395
9ae0353c9f5d status: move the boundary comparison logic within the timestamp module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1836
                    file_mtime = timestamp.reliable_mtime_of(s, mtime_boundary)
9ae0353c9f5d status: move the boundary comparison logic within the timestamp module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1837
                    if file_mtime is not None:
9ae0353c9f5d status: move the boundary comparison logic within the timestamp module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1838
                        cache_info = (mode, size, file_mtime)
9ae0353c9f5d status: move the boundary comparison logic within the timestamp module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1839
                        fixup.append((f, cache_info))
9ae0353c9f5d status: move the boundary comparison logic within the timestamp module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48390
diff changeset
  1840
                    else:
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1841
                        clean.append(f)
32651
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1842
            except (IOError, OSError):
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1843
                # A file become inaccessible in between? Mark it as deleted,
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1844
                # matching dirstate behavior (issue5584).
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1845
                # The dirstate has more complex behavior around whether a
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1846
                # missing file matches a directory, etc, but we don't need to
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1847
                # bother with that: if f has made it to this point, we're sure
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1848
                # it's in the dirstate.
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1849
                deleted.append(f)
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1850
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1851
        return modified, deleted, clean, fixup
32812
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32781
diff changeset
  1852
32813
6d73b7ff8f92 workingctx: also pass status tuple into poststatusfixup
Siddharth Agarwal <sid0@fb.com>
parents: 32812
diff changeset
  1853
    def _poststatusfixup(self, status, fixup):
32812
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32781
diff changeset
  1854
        """update dirstate for files that are actually clean"""
50215
ae61851e6fe2 dirstate: add a way to test races happening during status
Raphaël Gomès <rgomes@octobus.net>, Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49306
diff changeset
  1855
        testing.wait_on_cfg(self._repo.ui, b'status.pre-dirstate-write-file')
50130
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1856
        dirstate = self._repo.dirstate
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32813
diff changeset
  1857
        poststatus = self._repo.postdsstatus()
50130
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1858
        if fixup:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1859
            if dirstate.is_changing_parents:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1860
                normal = lambda f, pfd: dirstate.update_file(
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1861
                    f,
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1862
                    p1_tracked=True,
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1863
                    wc_tracked=True,
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1864
                )
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1865
            else:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1866
                normal = dirstate.set_clean
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1867
            for f, pdf in fixup:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1868
                normal(f, pdf)
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1869
        if poststatus or self._repo.dirstate._dirty:
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1870
            try:
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1871
                # updating the dirstate is optional
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1872
                # so we don't wait on the lock
21990
48e32c2c499b context: call normal on the right object
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
  1873
                # wlock can invalidate the dirstate, so cache normal _after_
48e32c2c499b context: call normal on the right object
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
  1874
                # taking the lock
50130
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1875
                pre_dirty = dirstate._dirty
27813
ff20fe74e5c6 with: use context manager for wlock in checklookup
Bryan O'Sullivan <bryano@fb.com>
parents: 27812
diff changeset
  1876
                with self._repo.wlock(False):
50130
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1877
                    assert self._repo.dirstate is dirstate
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1878
                    post_dirty = dirstate._dirty
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1879
                    if post_dirty:
50055
c5ef535e274e status: fix post status writing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50022
diff changeset
  1880
                        tr = self._repo.currenttransaction()
50130
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1881
                        dirstate.write(tr)
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1882
                    elif pre_dirty:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1883
                        # the wlock grabbing detected that dirtate changes
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1884
                        # needed to be dropped
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1885
                        m = b'skip updating dirstate: identity mismatch\n'
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1886
                        self._repo.ui.debug(m)
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1887
                    if poststatus:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1888
                        for ps in poststatus:
9e1debbb477e status: simplify the post status fixup phases
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50056
diff changeset
  1889
                            ps(self, status)
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1890
            except error.LockError:
50131
e5f5f1c1c452 status: invalidate dirstate on LockError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50130
diff changeset
  1891
                dirstate.invalidate()
32814
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32813
diff changeset
  1892
            finally:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32813
diff changeset
  1893
                # Even if the wlock couldn't be grabbed, clear out the list.
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32813
diff changeset
  1894
                self._repo.clearpostdsstatus()
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1895
33937
e43264525ce5 context: remove unnecessary default values for matchers (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33936
diff changeset
  1896
    def _dirstatestatus(self, match, ignored=False, clean=False, unknown=False):
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1897
        '''Gets the status from the dirstate -- internal use only.'''
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1898
        subrepos = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1899
        if b'.hgsub' in self:
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1900
            subrepos = sorted(self.substate)
50134
0d6173373fa5 status: use `running_status` in dirstate status
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50133
diff changeset
  1901
        dirstate = self._repo.dirstate
0d6173373fa5 status: use `running_status` in dirstate status
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50133
diff changeset
  1902
        with dirstate.running_status(self._repo):
0d6173373fa5 status: use `running_status` in dirstate status
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50133
diff changeset
  1903
            cmp, s, mtime_boundary = dirstate.status(
50133
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1904
                match, subrepos, ignored=ignored, clean=clean, unknown=unknown
48390
322525db4c98 status: use filesystem time boundary to invalidate racy mtime
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48381
diff changeset
  1905
            )
50133
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1906
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1907
            # check for any possibly clean files
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1908
            fixup = []
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1909
            if cmp:
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1910
                modified2, deleted2, clean_set, fixup = self._checklookup(
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1911
                    cmp, mtime_boundary
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1912
                )
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1913
                s.modified.extend(modified2)
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1914
                s.deleted.extend(deleted2)
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1915
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1916
                if clean_set and clean:
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1917
                    s.clean.extend(clean_set)
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1918
                if fixup and clean:
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1919
                    s.clean.extend((f for f, _ in fixup))
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1920
21b6ce3ade35 status: pre-indent the dirstate status code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50131
diff changeset
  1921
            self._poststatusfixup(s, fixup)
32812
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32781
diff changeset
  1922
23776
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1923
        if match.always():
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1924
            # cache for performance
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1925
            if s.unknown or s.ignored or s.clean:
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1926
                # "_status" is cached with list*=False in the normal route
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1927
                self._status = scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1928
                    s.modified, s.added, s.removed, s.deleted, [], [], []
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1929
                )
23776
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1930
            else:
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1931
                self._status = s
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1932
23303
3f269bd4826c context.status: avoid de- and reconstructing status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23302
diff changeset
  1933
        return s
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1934
31259
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1935
    @propertycache
42291
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1936
    def _copies(self):
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1937
        p1copies = {}
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1938
        p2copies = {}
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1939
        parents = self._repo.dirstate.parents()
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1940
        p1manifest = self._repo[parents[0]].manifest()
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1941
        p2manifest = self._repo[parents[1]].manifest()
42859
2b869a515ba6 context: filter out invalid copies from workingctx.p[12]copies()
Martin von Zweigbergk <martinvonz@google.com>
parents: 42769
diff changeset
  1942
        changedset = set(self.added()) | set(self.modified())
42291
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1943
        narrowmatch = self._repo.narrowmatch()
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1944
        for dst, src in self._repo.dirstate.copies().items():
42859
2b869a515ba6 context: filter out invalid copies from workingctx.p[12]copies()
Martin von Zweigbergk <martinvonz@google.com>
parents: 42769
diff changeset
  1945
            if dst not in changedset or not narrowmatch(dst):
42291
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1946
                continue
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1947
            if src in p1manifest:
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1948
                p1copies[dst] = src
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1949
            elif src in p2manifest:
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1950
                p2copies[dst] = src
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1951
        return p1copies, p2copies
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1952
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42290
diff changeset
  1953
    @propertycache
31259
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1954
    def _manifest(self):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1955
        """generate a manifest corresponding to the values in self._status
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1956
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1957
        This reuse the file nodeid from parent, but we use special node
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1958
        identifiers for added and modified files. This is used by manifests
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1959
        merge to see that files are different and by update logic to avoid
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1960
        deleting newly added files.
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1961
        """
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1962
        return self._buildstatusmanifest(self._status)
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1963
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1964
    def _buildstatusmanifest(self, status):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1965
        """Builds a manifest that includes the given status results."""
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1966
        parents = self.parents()
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1967
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1968
        man = parents[0].manifest().copy()
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1969
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1970
        ff = self._flagfunc
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1971
        for i, l in (
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1972
            (self._repo.nodeconstants.addednodeid, status.added),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  1973
            (self._repo.nodeconstants.modifiednodeid, status.modified),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1974
        ):
31259
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1975
            for f in l:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1976
                man[f] = i
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1977
                try:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1978
                    man.setflag(f, ff(f))
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1979
                except OSError:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1980
                    pass
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1981
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1982
        for f in status.deleted + status.removed:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1983
            if f in man:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1984
                del man[f]
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1985
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1986
        return man
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31258
diff changeset
  1987
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1988
    def _buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1989
        self, other, s, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  1990
    ):
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1991
        """build a status with respect to another context
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1992
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1993
        This includes logic for maintaining the fast path of status when
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1994
        comparing the working directory against its parent, which is to skip
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1995
        building a new manifest if self (working directory) is not comparing
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1996
        against its parent (repo['.']).
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1997
        """
23239
9fbb50444d55 context.status: call _dirstatestatus() from within _buildstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23238
diff changeset
  1998
        s = self._dirstatestatus(match, listignored, listclean, listunknown)
23543
4dd8a6a1240d spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23410
diff changeset
  1999
        # Filter out symlinks that, in the case of FAT32 and NTFS filesystems,
23242
18168938e1c1 context.status: only filter suspect symlinks in the dirstate status
Martin von Zweigbergk <martinvonz@google.com>
parents: 23241
diff changeset
  2000
        # might have accidentally ended up with the entire contents of the file
23543
4dd8a6a1240d spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23410
diff changeset
  2001
        # they are supposed to be linking to.
23302
24f67ad49da7 context.status: make _dirstatestatus() return an status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23301
diff changeset
  2002
        s.modified[:] = self._filtersuspectsymlink(s.modified)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2003
        if other != self._repo[b'.']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2004
            s = super(workingctx, self)._buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2005
                other, s, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2006
            )
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  2007
        return s
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  2008
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
  2009
    def _matchstatus(self, other, match):
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2010
        """override the match method with a filter for directory patterns
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2011
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2012
        We use inheritance to customize the match.bad method only in cases of
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2013
        workingctx since it belongs only to the working directory when
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2014
        comparing against the parent changeset.
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2015
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2016
        If we aren't comparing against the working directory's parent, then we
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2017
        just use the default match object sent to us.
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2018
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2019
        if other != self._repo[b'.']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2020
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2021
            def bad(f, msg):
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2022
                # 'f' may be a directory pattern from 'match.files()',
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2023
                # so 'f not in ctx1' is not enough
24326
637da5711122 manifest: have context use self.hasdir()
Drew Gottlieb <drgott@google.com>
parents: 24325
diff changeset
  2024
                if f not in other and not other.hasdir(f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2025
                    self._repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2026
                        b'%s: %s\n' % (self._repo.dirstate.pathto(f), msg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2027
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2028
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2029
            match.bad = bad
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2030
        return match
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  2031
42293
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2032
    def walk(self, match):
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2033
        '''Generates matching file names.'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2034
        return sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2035
            self._repo.dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2036
                self._repo.narrowmatch(match),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2037
                subrepos=sorted(self.substate),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2038
                unknown=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2039
                ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2040
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2041
        )
42293
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2042
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2043
    def matches(self, match):
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2044
        match = self._repo.narrowmatch(match)
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2045
        ds = self._repo.dirstate
48095
20d0149b8a0a dirstate-item: use `tracked` instead of `state` in context.matches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48094
diff changeset
  2046
        return sorted(f for f in ds.matches(match) if ds.get_entry(f).tracked)
42293
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42292
diff changeset
  2047
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  2048
    def markcommitted(self, node):
49961
7a8bfc05b691 dirstate: rename parentchange to changing_parents
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49960
diff changeset
  2049
        with self._repo.dirstate.changing_parents(self._repo):
42295
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2050
            for f in self.modified() + self.added():
47706
5bbf304271a0 context: use `update_file` instead of `normal` in `markcommitted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47705
diff changeset
  2051
                self._repo.dirstate.update_file(
5bbf304271a0 context: use `update_file` instead of `normal` in `markcommitted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47705
diff changeset
  2052
                    f, p1_tracked=True, wc_tracked=True
5bbf304271a0 context: use `update_file` instead of `normal` in `markcommitted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47705
diff changeset
  2053
                )
42295
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2054
            for f in self.removed():
47745
06d57a91441e context: use `update_file` instead of `drop` in `markcommitted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47706
diff changeset
  2055
                self._repo.dirstate.update_file(
06d57a91441e context: use `update_file` instead of `drop` in `markcommitted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47706
diff changeset
  2056
                    f, p1_tracked=False, wc_tracked=False
06d57a91441e context: use `update_file` instead of `drop` in `markcommitted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47706
diff changeset
  2057
                )
42295
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2058
            self._repo.dirstate.setparents(node)
44104
85c4cd73996b localrepo: also fastpath access to working copy parents when possible
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44052
diff changeset
  2059
            self._repo._quick_access_changeid_invalidate()
42295
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2060
47605
a5701ffc10e4 sparse: make sure we adjust the dirstate at the same time as the parent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47600
diff changeset
  2061
            sparse.aftercommit(self._repo, node)
a5701ffc10e4 sparse: make sure we adjust the dirstate at the same time as the parent
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47600
diff changeset
  2062
42295
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2063
        # write changes out explicitly, because nesting wlock at
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2064
        # runtime may prevent 'wlock.release()' in 'repo.commit()'
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2065
        # from immediately doing so for subsequent changing files
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42293
diff changeset
  2066
        self._repo.dirstate.write(self._repo.currenttransaction())
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  2067
44857
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
  2068
    def mergestate(self, clean=False):
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
  2069
        if clean:
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
  2070
            return mergestatemod.mergestate.clean(self._repo)
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
  2071
        return mergestatemod.mergestate.read(self._repo)
e607099d8b93 context: implement mergestate() method
Augie Fackler <augie@google.com>
parents: 44365
diff changeset
  2072
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2073
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2074
class committablefilectx(basefilectx):
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2075
    """A committablefilectx provides common functionality for a file context
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2076
    that wants the ability to commit, e.g. workingfilectx or memfilectx."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2077
19701
f0f8380ec516 commitablefilectx: add a class that will be used for mutable file contexts
Sean Farley <sean.michael.farley@gmail.com>
parents: 19700
diff changeset
  2078
    def __init__(self, repo, path, filelog=None, ctx=None):
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2079
        self._repo = repo
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2080
        self._path = path
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2081
        self._changeid = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2082
        self._filerev = self._filenode = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2083
19149
921b64e1f7b9 filecontext: use 'is not None' to check for filelog existence
Durham Goode <durham@fb.com>
parents: 19061
diff changeset
  2084
        if filelog is not None:
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2085
            self._filelog = filelog
19702
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  2086
        if ctx:
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  2087
            self._changectx = ctx
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  2088
19703
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  2089
    def __nonzero__(self):
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  2090
        return True
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  2091
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
  2092
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31464
diff changeset
  2093
24420
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2094
    def linkrev(self):
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2095
        # linked to self._changectx no matter if file is modified or not
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2096
        return self.rev()
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2097
41770
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41769
diff changeset
  2098
    def renamed(self):
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41769
diff changeset
  2099
        path = self.copysource()
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41769
diff changeset
  2100
        if not path:
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41769
diff changeset
  2101
            return None
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2102
        return (
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2103
            path,
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2104
            self._changectx._parents[0]._manifest.get(
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2105
                path, self._repo.nodeconstants.nullid
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2106
            ),
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2107
        )
41770
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41769
diff changeset
  2108
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2109
    def parents(self):
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2110
        '''return parent filectxs, following copies if necessary'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2111
8528
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2112
        def filenode(ctx, path):
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2113
            return ctx._manifest.get(path, self._repo.nodeconstants.nullid)
8528
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2114
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2115
        path = self._path
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2116
        fl = self._filelog
8528
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2117
        pcl = self._changectx._parents
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2118
        renamed = self.renamed()
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2119
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2120
        if renamed:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2121
            pl = [renamed + (None,)]
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2122
        else:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2123
            pl = [(path, filenode(pcl[0], path), fl)]
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2124
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2125
        for pc in pcl[1:]:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2126
            pl.append((path, filenode(pc, path), fl))
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2127
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2128
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2129
            self._parentfilectx(p, fileid=n, filelog=l)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2130
            for p, n, l in pl
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2131
            if n != self._repo.nodeconstants.nullid
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2132
        ]
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2133
19705
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  2134
    def children(self):
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  2135
        return []
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  2136
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2137
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2138
class workingfilectx(committablefilectx):
19704
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2139
    """A workingfilectx object makes access to data related to a particular
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  2140
    file in the working directory convenient."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2141
19704
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2142
    def __init__(self, repo, path, filelog=None, workingctx=None):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2143
        super(workingfilectx, self).__init__(repo, path, filelog, workingctx)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2144
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2145
    @propertycache
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2146
    def _changectx(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2147
        return workingctx(self._repo)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2148
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2149
    def data(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2150
        return self._repo.wread(self._path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2151
41768
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
  2152
    def copysource(self):
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
  2153
        return self._repo.dirstate.copied(self._path)
19704
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2154
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2155
    def size(self):
19901
4d3ce1646dfc context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
  2156
        return self._repo.wvfs.lstat(self._path).st_size
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2157
42456
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42407
diff changeset
  2158
    def lstat(self):
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42407
diff changeset
  2159
        return self._repo.wvfs.lstat(self._path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2160
3962
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2161
    def date(self):
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2162
        t, tz = self._changectx.date()
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2163
        try:
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36721
diff changeset
  2164
            return (self._repo.wvfs.lstat(self._path)[stat.ST_MTIME], tz)
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 49284
diff changeset
  2165
        except FileNotFoundError:
3962
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2166
            return (t, tz)
3310
0e370798eebf context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents: 3302
diff changeset
  2167
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33086
diff changeset
  2168
    def exists(self):
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33086
diff changeset
  2169
        return self._repo.wvfs.exists(self._path)
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33086
diff changeset
  2170
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33086
diff changeset
  2171
    def lexists(self):
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33086
diff changeset
  2172
        return self._repo.wvfs.lexists(self._path)
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33086
diff changeset
  2173
33086
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  2174
    def audit(self):
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  2175
        return self._repo.wvfs.audit(self._path)
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33085
diff changeset
  2176
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  2177
    def cmp(self, fctx):
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  2178
        """compare with other file context
11539
a463e3c50212 cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11538
diff changeset
  2179
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  2180
        returns True if different than fctx.
11539
a463e3c50212 cmp: document the fact that we return True if content is different
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11538
diff changeset
  2181
        """
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
  2182
        # fctx should be a filectx (not a workingfilectx)
11703
55a2af02e45c context: reuse filecontext.cmp in workingfilecontext.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11702
diff changeset
  2183
        # invert comparison to reuse the same code path
55a2af02e45c context: reuse filecontext.cmp in workingfilecontext.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11702
diff changeset
  2184
        return fctx.cmp(self)
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2185
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2186
    def remove(self, ignoremissing=False):
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2187
        """wraps unlink for a repo's working directory"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2188
        rmdir = self._repo.ui.configbool(b'experimental', b'removeemptydirs')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2189
        self._repo.wvfs.unlinkpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2190
            self._path, ignoremissing=ignoremissing, rmdir=rmdir
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2191
        )
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2192
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2193
    def write(self, data, flags, backgroundclose=False, **kwargs):
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2194
        """wraps repo.wwrite"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2195
        return self._repo.wwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2196
            self._path, data, flags, backgroundclose=backgroundclose, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2197
        )
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2198
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  2199
    def markcopied(self, src):
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  2200
        """marks this file a copy of `src`"""
42318
313812cbf4ca copies: fix duplicatecopies() with overlay context
Martin von Zweigbergk <martinvonz@google.com>
parents: 42297
diff changeset
  2201
        self._repo.dirstate.copy(src, self._path)
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  2202
34037
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33999
diff changeset
  2203
    def clearunknown(self):
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33999
diff changeset
  2204
        """Removes conflicting items in the working directory so that
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33999
diff changeset
  2205
        ``write()`` can be called successfully.
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33999
diff changeset
  2206
        """
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33999
diff changeset
  2207
        wvfs = self._repo.wvfs
34556
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34479
diff changeset
  2208
        f = self._path
34833
07bbb208a924 context: audit paths before clearing unknown files and dirs
Mark Thomas <mbthomas@fb.com>
parents: 34787
diff changeset
  2209
        wvfs.audit(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2210
        if self._repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2211
            b'experimental', b'merge.checkpathconflicts'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2212
        ):
39196
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2213
            # remove files under the directory as they should already be
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2214
            # warned and backed up
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2215
            if wvfs.isdir(f) and not wvfs.islink(f):
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2216
                wvfs.rmtree(f, forcibly=True)
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43506
diff changeset
  2217
            for p in reversed(list(pathutil.finddirs(f))):
37101
656ac240f392 context: skip path conflicts by default when clearing unknown file (issue5776)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37084
diff changeset
  2218
                if wvfs.isfileorlink(p):
656ac240f392 context: skip path conflicts by default when clearing unknown file (issue5776)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37084
diff changeset
  2219
                    wvfs.unlink(p)
656ac240f392 context: skip path conflicts by default when clearing unknown file (issue5776)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37084
diff changeset
  2220
                    break
39196
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2221
        else:
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2222
            # don't remove files if path conflicts are not processed
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2223
            if wvfs.isdir(f) and not wvfs.islink(f):
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2224
                wvfs.removedirs(f)
34037
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 33999
diff changeset
  2225
33084
873f638fd7db merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com>
parents: 33022
diff changeset
  2226
    def setflags(self, l, x):
873f638fd7db merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com>
parents: 33022
diff changeset
  2227
        self._repo.wvfs.setflags(self._path, l, x)
873f638fd7db merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com>
parents: 33022
diff changeset
  2228
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2229
35323
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35322
diff changeset
  2230
class overlayworkingctx(committablectx):
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35322
diff changeset
  2231
    """Wraps another mutable context with a write-back cache that can be
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35322
diff changeset
  2232
    converted into a commit context.
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2233
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2234
    self._cache[path] maps to a dict with keys: {
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2235
        'exists': bool?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2236
        'date': date?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2237
        'data': str?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2238
        'flags': str?
35293
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2239
        'copied': str? (path or None)
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2240
    }
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2241
    If `exists` is True, `flags` must be non-None and 'date' is non-None. If it
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2242
    is `False`, the file was deleted.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2243
    """
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2244
35289
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35286
diff changeset
  2245
    def __init__(self, repo):
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2246
        super(overlayworkingctx, self).__init__(repo)
35286
307b1689e3f8 overlayworkingctx: make clean() public
Phil Cohen <phillco@fb.com>
parents: 35285
diff changeset
  2247
        self.clean()
35289
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35286
diff changeset
  2248
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35286
diff changeset
  2249
    def setbase(self, wrappedctx):
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2250
        self._wrappedctx = wrappedctx
35289
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35286
diff changeset
  2251
        self._parents = [wrappedctx]
35327
777cb4497d8d overlayworkingctx: invalidate the manifest cache when changing parents
Phil Cohen <phillco@fb.com>
parents: 35326
diff changeset
  2252
        # Drop old manifest cache as it is now out of date.
777cb4497d8d overlayworkingctx: invalidate the manifest cache when changing parents
Phil Cohen <phillco@fb.com>
parents: 35326
diff changeset
  2253
        # This is necessary when, e.g., rebasing several nodes with one
777cb4497d8d overlayworkingctx: invalidate the manifest cache when changing parents
Phil Cohen <phillco@fb.com>
parents: 35326
diff changeset
  2254
        # ``overlayworkingctx`` (e.g. with --collapse).
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2255
        util.clearcachedproperty(self, b'_manifest')
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2256
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2257
    def setparents(self, p1node, p2node=None):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2258
        if p2node is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2259
            p2node = self._repo.nodeconstants.nullid
44051
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2260
        assert p1node == self._wrappedctx.node()
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2261
        self._parents = [self._wrappedctx, self._repo.unfiltered()[p2node]]
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2262
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2263
    def data(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2264
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2265
            if self._cache[path][b'exists']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2266
                if self._cache[path][b'data'] is not None:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2267
                    return self._cache[path][b'data']
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2268
                else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2269
                    # Must fallback here, too, because we only set flags.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2270
                    return self._wrappedctx[path].data()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2271
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2272
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2273
                    b"No such file or directory: %s" % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2274
                )
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2275
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2276
            return self._wrappedctx[path].data()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2277
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2278
    @propertycache
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2279
    def _manifest(self):
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2280
        parents = self.parents()
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2281
        man = parents[0].manifest().copy()
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2282
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2283
        flag = self._flagfunc
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2284
        for path in self.added():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2285
            man[path] = self._repo.nodeconstants.addednodeid
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2286
            man.setflag(path, flag(path))
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2287
        for path in self.modified():
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2288
            man[path] = self._repo.nodeconstants.modifiednodeid
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2289
            man.setflag(path, flag(path))
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2290
        for path in self.removed():
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2291
            del man[path]
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2292
        return man
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2293
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2294
    @propertycache
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2295
    def _flagfunc(self):
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2296
        def f(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2297
            return self._cache[path][b'flags']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2298
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2299
        return f
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2300
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2301
    def files(self):
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2302
        return sorted(self.added() + self.modified() + self.removed())
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2303
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2304
    def modified(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2305
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2306
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2307
            for f in self._cache.keys()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2308
            if self._cache[f][b'exists'] and self._existsinparent(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2309
        ]
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2310
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2311
    def added(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2312
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2313
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2314
            for f in self._cache.keys()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2315
            if self._cache[f][b'exists'] and not self._existsinparent(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2316
        ]
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2317
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2318
    def removed(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2319
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2320
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2321
            for f in self._cache.keys()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2322
            if not self._cache[f][b'exists'] and self._existsinparent(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2323
        ]
35321
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35319
diff changeset
  2324
41755
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2325
    def p1copies(self):
44039
f652b7ddc1d4 overlwayworkingctx: remove doubly bad reference to wrapped ctx for copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44023
diff changeset
  2326
        copies = {}
41755
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2327
        narrowmatch = self._repo.narrowmatch()
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2328
        for f in self._cache.keys():
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2329
            if not narrowmatch(f):
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2330
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2331
            copies.pop(f, None)  # delete if it exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2332
            source = self._cache[f][b'copied']
41755
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2333
            if source:
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2334
                copies[f] = source
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2335
        return copies
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2336
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2337
    def p2copies(self):
44039
f652b7ddc1d4 overlwayworkingctx: remove doubly bad reference to wrapped ctx for copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44023
diff changeset
  2338
        copies = {}
41755
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2339
        narrowmatch = self._repo.narrowmatch()
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2340
        for f in self._cache.keys():
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2341
            if not narrowmatch(f):
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2342
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2343
            copies.pop(f, None)  # delete if it exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2344
            source = self._cache[f][b'copied']
41755
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2345
            if source:
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2346
                copies[f] = source
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2347
        return copies
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41646
diff changeset
  2348
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  2349
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  2350
        return True
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  2351
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2352
    def filedate(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2353
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2354
            return self._cache[path][b'date']
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2355
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2356
            return self._wrappedctx[path].date()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2357
35293
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2358
    def markcopied(self, path, origin):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2359
        self._markdirty(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2360
            path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2361
            exists=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2362
            date=self.filedate(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2363
            flags=self.flags(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2364
            copied=origin,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2365
        )
35293
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2366
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2367
    def copydata(self, path):
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2368
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2369
            return self._cache[path][b'copied']
35293
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2370
        else:
42288
cdcebc897529 overlaycontext: allow calling copydata() on clean context
Martin von Zweigbergk <martinvonz@google.com>
parents: 42193
diff changeset
  2371
            return None
35293
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2372
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2373
    def flags(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2374
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2375
            if self._cache[path][b'exists']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2376
                return self._cache[path][b'flags']
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2377
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2378
                raise error.ProgrammingError(
44934
b2e5ec0c596b context: fix creation of ProgrammingError to not use non-existent field
Martin von Zweigbergk <martinvonz@google.com>
parents: 44916
diff changeset
  2379
                    b"No such file or directory: %s" % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2380
                )
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2381
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2382
            return self._wrappedctx[path].flags()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2383
40803
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2384
    def __contains__(self, key):
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2385
        if key in self._cache:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2386
            return self._cache[key][b'exists']
40803
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2387
        return key in self.p1()
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2388
35295
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2389
    def _existsinparent(self, path):
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2390
        try:
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2391
            # ``commitctx` raises a ``ManifestLookupError`` if a path does not
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2392
            # exist, unlike ``workingctx``, which returns a ``workingfilectx``
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2393
            # with an ``exists()`` function.
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2394
            self._wrappedctx[path]
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2395
            return True
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2396
        except error.ManifestLookupError:
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2397
            return False
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2398
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2399
    def _auditconflicts(self, path):
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2400
        """Replicates conflict checks done by wvfs.write().
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2401
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2402
        Since we never write to the filesystem and never call `applyupdates` in
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2403
        IMM, we'll never check that a path is actually writable -- e.g., because
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2404
        it adds `a/foo`, but `a` is actually a file in the other commit.
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2405
        """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2406
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2407
        def fail(path, component):
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2408
            # p1() is the base and we're receiving "writes" for p2()'s
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2409
            # files.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2410
            if b'l' in self.p1()[component].flags():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2411
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2412
                    b"error: %s conflicts with symlink %s "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2413
                    b"in %d." % (path, component, self.p1().rev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2414
                )
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2415
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2416
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2417
                    b"error: '%s' conflicts with file '%s' in "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2418
                    b"%d." % (path, component, self.p1().rev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2419
                )
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2420
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2421
        # Test that each new directory to be created to write this path from p2
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2422
        # is not a file in p1.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2423
        components = path.split(b'/')
49284
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 49012
diff changeset
  2424
        for i in range(len(components)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2425
            component = b"/".join(components[0:i])
40803
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2426
            if component in self:
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2427
                fail(path, component)
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2428
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2429
        # Test the other direction -- that this path from p2 isn't a directory
40816
1c8c54cf9725 rebase: fix path auditing to audit path relative to repo root (issue5818)
Martin von Zweigbergk <martinvonz@google.com>
parents: 40803
diff changeset
  2430
        # in p1 (test that p1 doesn't have any paths matching `path/*`).
42102
976f069e0ad6 overlayworkingctx: remove misleading trailing slash from directory pattern
Martin von Zweigbergk <martinvonz@google.com>
parents: 42101
diff changeset
  2431
        match = self.match([path], default=b'path')
44263
beea86e4d332 context: use manifest.walk() instead of manifest.match() to get file list
Augie Fackler <augie@google.com>
parents: 44109
diff changeset
  2432
        mfiles = list(self.p1().manifest().walk(match))
39576
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39292
diff changeset
  2433
        if len(mfiles) > 0:
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39292
diff changeset
  2434
            if len(mfiles) == 1 and mfiles[0] == path:
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39292
diff changeset
  2435
                return
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39292
diff changeset
  2436
            # omit the files which are deleted in current IMM wctx
40803
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2437
            mfiles = [m for m in mfiles if m in self]
39576
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39292
diff changeset
  2438
            if not mfiles:
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2439
                return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2440
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2441
                b"error: file '%s' cannot be written because "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2442
                b" '%s/' is a directory in %s (containing %d "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2443
                b"entries: %s)"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2444
                % (path, path, self.p1(), len(mfiles), b', '.join(mfiles))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2445
            )
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2446
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2447
    def write(self, path, data, flags=b'', **kwargs):
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2448
        if data is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2449
            raise error.ProgrammingError(b"data must be non-None")
35324
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35323
diff changeset
  2450
        self._auditconflicts(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2451
        self._markdirty(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2452
            path, exists=True, data=data, date=dateutil.makedate(), flags=flags
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2453
        )
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2454
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2455
    def setflags(self, path, l, x):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2456
        flag = b''
39066
2488dcfa71f8 context: safegaurd from 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38818
diff changeset
  2457
        if l:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2458
            flag = b'l'
39066
2488dcfa71f8 context: safegaurd from 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38818
diff changeset
  2459
        elif x:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2460
            flag = b'x'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2461
        self._markdirty(path, exists=True, date=dateutil.makedate(), flags=flag)
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2462
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2463
    def remove(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2464
        self._markdirty(path, exists=False)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2465
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2466
    def exists(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2467
        """exists behaves like `lexists`, but needs to follow symlinks and
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2468
        return False if they are broken.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2469
        """
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2470
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2471
            # If this path exists and is a symlink, "follow" it by calling
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2472
            # exists on the destination path.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2473
            if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2474
                self._cache[path][b'exists']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2475
                and b'l' in self._cache[path][b'flags']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2476
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2477
                return self.exists(self._cache[path][b'data'].strip())
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2478
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2479
                return self._cache[path][b'exists']
35295
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2480
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2481
        return self._existsinparent(path)
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2482
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2483
    def lexists(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2484
        """lexists returns True if the path exists"""
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2485
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2486
            return self._cache[path][b'exists']
35295
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2487
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2488
        return self._existsinparent(path)
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2489
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2490
    def size(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2491
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2492
            if self._cache[path][b'exists']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2493
                return len(self._cache[path][b'data'])
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2494
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2495
                raise error.ProgrammingError(
44934
b2e5ec0c596b context: fix creation of ProgrammingError to not use non-existent field
Martin von Zweigbergk <martinvonz@google.com>
parents: 44916
diff changeset
  2496
                    b"No such file or directory: %s" % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2497
                )
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2498
        return self._wrappedctx[path].size()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2499
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2500
    def tomemctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2501
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2502
        text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2503
        branch=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2504
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2505
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2506
        parents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2507
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2508
        editor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2509
    ):
35325
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2510
        """Converts this ``overlayworkingctx`` into a ``memctx`` ready to be
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2511
        committed.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2512
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2513
        ``text`` is the commit message.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2514
        ``parents`` (optional) are rev numbers.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2515
        """
44051
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2516
        # Default parents to the wrapped context if not passed.
35325
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2517
        if parents is None:
44051
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2518
            parents = self.parents()
35325
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2519
            if len(parents) == 1:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2520
                parents = (parents[0], None)
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2521
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2522
        # ``parents`` is passed as rev numbers; convert to ``commitctxs``.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2523
        if parents[1] is None:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2524
            parents = (self._repo[parents[0]], None)
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2525
        else:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2526
            parents = (self._repo[parents[0]], self._repo[parents[1]])
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2527
42290
e79aeb518aa1 overlayworkingctx: don't include added-then-deleted files in memctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42288
diff changeset
  2528
        files = self.files()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2529
35325
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2530
        def getfile(repo, memctx, path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2531
            if self._cache[path][b'exists']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2532
                return memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2533
                    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2534
                    memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2535
                    path,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2536
                    self._cache[path][b'data'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2537
                    b'l' in self._cache[path][b'flags'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2538
                    b'x' in self._cache[path][b'flags'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2539
                    self._cache[path][b'copied'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2540
                )
35325
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2541
            else:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2542
                # Returning None, but including the path in `files`, is
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2543
                # necessary for memctx to register a deletion.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2544
                return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2545
44050
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 44039
diff changeset
  2546
        if branch is None:
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 44039
diff changeset
  2547
            branch = self._wrappedctx.branch()
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 44039
diff changeset
  2548
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2549
        return memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2550
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2551
            parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2552
            text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2553
            files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2554
            getfile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2555
            date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2556
            extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2557
            user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2558
            branch=branch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2559
            editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2560
        )
35325
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35324
diff changeset
  2561
44365
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2562
    def tomemctx_for_amend(self, precursor):
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2563
        extra = precursor.extra().copy()
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2564
        extra[b'amend_source'] = precursor.hex()
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2565
        return self.tomemctx(
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2566
            text=precursor.description(),
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2567
            branch=precursor.branch(),
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2568
            extra=extra,
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2569
            date=precursor.date(),
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2570
            user=precursor.user(),
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2571
        )
7c4b98a4e536 copy: add experimetal support for unmarking committed copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44354
diff changeset
  2572
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2573
    def isdirty(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2574
        return path in self._cache
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2575
35286
307b1689e3f8 overlayworkingctx: make clean() public
Phil Cohen <phillco@fb.com>
parents: 35285
diff changeset
  2576
    def clean(self):
45499
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45489
diff changeset
  2577
        self._mergestate = None
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2578
        self._cache = {}
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2579
45228
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2580
    def _compact(self):
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2581
        """Removes keys from the cache that are actually clean, by comparing
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2582
        them with the underlying context.
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2583
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2584
        This can occur during the merge process, e.g. by passing --tool :local
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2585
        to resolve a conflict.
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2586
        """
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2587
        keys = []
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2588
        # This won't be perfect, but can help performance significantly when
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2589
        # using things like remotefilelog.
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2590
        scmutil.prefetchfiles(
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2591
            self.repo(),
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2592
            [
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2593
                (
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2594
                    self.p1().rev(),
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2595
                    scmutil.matchfiles(self.repo(), self._cache.keys()),
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2596
                )
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2597
            ],
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2598
        )
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2599
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2600
        for path in self._cache.keys():
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2601
            cache = self._cache[path]
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2602
            try:
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2603
                underlying = self._wrappedctx[path]
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2604
                if (
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2605
                    underlying.data() == cache[b'data']
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2606
                    and underlying.flags() == cache[b'flags']
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2607
                ):
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2608
                    keys.append(path)
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2609
            except error.ManifestLookupError:
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2610
                # Path not in the underlying manifest (created).
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2611
                continue
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2612
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2613
        for path in keys:
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2614
            del self._cache[path]
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2615
        return keys
1476ec96965f context: re-add `overlayworkingctx._compact()` removed in 6a5dcd754842
Manuel Jacob <me@manueljacob.de>
parents: 45091
diff changeset
  2616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2617
    def _markdirty(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2618
        self, path, exists, data=None, date=None, flags=b'', copied=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2619
    ):
39127
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39078
diff changeset
  2620
        # data not provided, let's see if we already have some; if not, let's
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39078
diff changeset
  2621
        # grab it from our underlying context, so that we always have data if
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39078
diff changeset
  2622
        # the file is marked as existing.
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39078
diff changeset
  2623
        if exists and data is None:
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39078
diff changeset
  2624
            oldentry = self._cache.get(path) or {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2625
            data = oldentry.get(b'data')
42528
e079e001d536 rebase: fix in-memory rebasing of copy of empty file
Martin von Zweigbergk <martinvonz@google.com>
parents: 42456
diff changeset
  2626
            if data is None:
e079e001d536 rebase: fix in-memory rebasing of copy of empty file
Martin von Zweigbergk <martinvonz@google.com>
parents: 42456
diff changeset
  2627
                data = self._wrappedctx[path].data()
39127
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39078
diff changeset
  2628
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2629
        self._cache[path] = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2630
            b'exists': exists,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2631
            b'data': data,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2632
            b'date': date,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2633
            b'flags': flags,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2634
            b'copied': copied,
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2635
        }
46416
bc3f3b59d0a4 context: add missing manifest invalidation after write in overlayworkingctx
Augie Fackler <augie@google.com>
parents: 45942
diff changeset
  2636
        util.clearcachedproperty(self, b'_manifest')
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2637
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2638
    def filectx(self, path, filelog=None):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2639
        return overlayworkingfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2640
            self._repo, path, parent=self, filelog=filelog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2641
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2642
45499
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45489
diff changeset
  2643
    def mergestate(self, clean=False):
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45489
diff changeset
  2644
        if clean or self._mergestate is None:
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45489
diff changeset
  2645
            self._mergestate = mergestatemod.memmergestate(self._repo)
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45489
diff changeset
  2646
        return self._mergestate
19590b126764 merge: use in-memory mergestate when using in-memory context
Martin von Zweigbergk <martinvonz@google.com>
parents: 45489
diff changeset
  2647
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2648
35323
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35322
diff changeset
  2649
class overlayworkingfilectx(committablefilectx):
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2650
    """Wrap a ``workingfilectx`` but intercepts all writes into an in-memory
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2651
    cache, which can be flushed through later by calling ``flush()``."""
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2652
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2653
    def __init__(self, repo, path, filelog=None, parent=None):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2654
        super(overlayworkingfilectx, self).__init__(repo, path, filelog, parent)
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2655
        self._repo = repo
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2656
        self._parent = parent
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2657
        self._path = path
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2658
34783
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2659
    def cmp(self, fctx):
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2660
        return self.data() != fctx.data()
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2661
35281
010179e21e91 context: switch ctx() use to changectx()
Phil Cohen <phillco@fb.com>
parents: 35271
diff changeset
  2662
    def changectx(self):
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2663
        return self._parent
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2664
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2665
    def data(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2666
        return self._parent.data(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2667
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2668
    def date(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2669
        return self._parent.filedate(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2670
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2671
    def exists(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2672
        return self.lexists()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2673
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2674
    def lexists(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2675
        return self._parent.exists(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2676
41768
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
  2677
    def copysource(self):
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
  2678
        return self._parent.copydata(self._path)
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41766
diff changeset
  2679
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2680
    def size(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2681
        return self._parent.size(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2682
35293
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2683
    def markcopied(self, origin):
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2684
        self._parent.markcopied(self._path, origin)
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35289
diff changeset
  2685
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2686
    def audit(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2687
        pass
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2688
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2689
    def flags(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2690
        return self._parent.flags(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2691
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2692
    def setflags(self, islink, isexec):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2693
        return self._parent.setflags(self._path, islink, isexec)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2694
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2695
    def write(self, data, flags, backgroundclose=False, **kwargs):
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2696
        return self._parent.write(self._path, data, flags, **kwargs)
34104
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2697
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2698
    def remove(self, ignoremissing=False):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2699
        return self._parent.remove(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34051
diff changeset
  2700
35322
baf58e621363 overlayworkingctx: add a no-op ``clearunknown()``
Phil Cohen <phillco@fb.com>
parents: 35321
diff changeset
  2701
    def clearunknown(self):
baf58e621363 overlayworkingctx: add a no-op ``clearunknown()``
Phil Cohen <phillco@fb.com>
parents: 35321
diff changeset
  2702
        pass
baf58e621363 overlayworkingctx: add a no-op ``clearunknown()``
Phil Cohen <phillco@fb.com>
parents: 35321
diff changeset
  2703
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2704
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2705
class workingcommitctx(workingctx):
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2706
    """A workingcommitctx object makes access to data related to
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2707
    the revision being committed convenient.
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2708
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2709
    This hides changes in the working directory, if they aren't
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2710
    committed in this context.
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2711
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2712
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2713
    def __init__(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2714
        self, repo, changes, text=b"", user=None, date=None, extra=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2715
    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2716
        super(workingcommitctx, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2717
            repo, text, user, date, extra, changes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2718
        )
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2719
33937
e43264525ce5 context: remove unnecessary default values for matchers (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33936
diff changeset
  2720
    def _dirstatestatus(self, match, ignored=False, clean=False, unknown=False):
23712
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2721
        """Return matched files only in ``self._status``
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2722
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2723
        Uncommitted files appear "clean" via this context, even if
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2724
        they aren't actually so in the working directory.
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2725
        """
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2726
        if clean:
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2727
            clean = [f for f in self._manifest if f not in self._changedset]
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2728
        else:
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2729
            clean = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2730
        return scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2731
            [f for f in self._status.modified if match(f)],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2732
            [f for f in self._status.added if match(f)],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2733
            [f for f in self._status.removed if match(f)],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2734
            [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2735
            [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2736
            [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2737
            clean,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2738
        )
23712
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2739
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2740
    @propertycache
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2741
    def _changedset(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  2742
        """Return the set of files changed in this context"""
23712
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2743
        changed = set(self._status.modified)
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2744
        changed.update(self._status.added)
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2745
        changed.update(self._status.removed)
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2746
        return changed
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2747
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2748
27906
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2749
def makecachingfilectxfn(func):
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2750
    """Create a filectxfn that caches based on the path.
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2751
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2752
    We can't use util.cachefunc because it uses all arguments as the cache
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2753
    key and this creates a cycle since the arguments include the repo and
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2754
    memctx.
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2755
    """
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2756
    cache = {}
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2757
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2758
    def getfilectx(repo, memctx, path):
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2759
        if path not in cache:
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2760
            cache[path] = func(repo, memctx, path)
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2761
        return cache[path]
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2762
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2763
    return getfilectx
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2764
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2765
32763
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2766
def memfilefromctx(ctx):
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2767
    """Given a context return a memfilectx for ctx[path]
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2768
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2769
    This is a convenience method for building a memctx based on another
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2770
    context.
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2771
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2772
32763
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2773
    def getfilectx(repo, memctx, path):
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2774
        fctx = ctx[path]
41994
550a172a603b memctx: rename constructor argument "copied" to "copysource" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41967
diff changeset
  2775
        copysource = fctx.copysource()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2776
        return memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2777
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2778
            memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2779
            path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2780
            fctx.data(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2781
            islink=fctx.islink(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2782
            isexec=fctx.isexec(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2783
            copysource=copysource,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2784
        )
32763
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2785
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2786
    return getfilectx
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32752
diff changeset
  2787
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2788
32764
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2789
def memfilefrompatch(patchstore):
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2790
    """Given a patch (e.g. patchstore object) return a memfilectx
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2791
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2792
    This is a convenience method for building a memctx based on a patchstore.
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2793
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2794
32764
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2795
    def getfilectx(repo, memctx, path):
41994
550a172a603b memctx: rename constructor argument "copied" to "copysource" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41967
diff changeset
  2796
        data, mode, copysource = patchstore.getfile(path)
32764
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2797
        if data is None:
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2798
            return None
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2799
        islink, isexec = mode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2800
        return memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2801
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2802
            memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2803
            path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2804
            data,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2805
            islink=islink,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2806
            isexec=isexec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2807
            copysource=copysource,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2808
        )
32764
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2809
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2810
    return getfilectx
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32763
diff changeset
  2811
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2812
21665
d2743be1bb06 memctx: inherit from committablectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21664
diff changeset
  2813
class memctx(committablectx):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2814
    """Use memctx to perform in-memory commits via localrepo.commitctx().
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2815
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2816
    Revision information is supplied at initialization time while
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2817
    related files data and is made available through a callback
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2818
    mechanism.  'repo' is the current localrepo, 'parents' is a
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2819
    sequence of two parent revisions identifiers (pass None for every
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2820
    missing parent), 'text' is the commit message and 'files' lists
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2821
    names of files touched by the revision (normalized and relative to
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2822
    repository root).
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2823
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2824
    filectxfn(repo, memctx, path) is a callable receiving the
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2825
    repository, the current memctx object and the normalized path of
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2826
    requested file, relative to repository root. It is fired by the
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2827
    commit function for every file in 'files', but calls order is
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2828
    undefined. If the file is available in the revision being
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2829
    committed (updated or added), filectxfn returns a memfilectx
31612
c93cdfa131a8 misc: update descriptions about removed file for filectxfn
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31476
diff changeset
  2830
    object. If the file was removed, filectxfn return None for recent
c93cdfa131a8 misc: update descriptions about removed file for filectxfn
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31476
diff changeset
  2831
    Mercurial. Moved files are represented by marking the source file
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2832
    removed and the new file added with copy information (see
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2833
    memfilectx).
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2834
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2835
    user receives the committer name and defaults to current
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2836
    repository username, date is the commit date in any format
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36411
diff changeset
  2837
    supported by dateutil.parsedate() and defaults to current date, extra
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2838
    is a dictionary of metadata or is left empty.
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2839
    """
22313
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2840
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2841
    # Mercurial <= 3.1 expects the filectxfn to raise IOError for missing files.
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2842
    # Extensions that need to retain compatibility across Mercurial 3.1 can use
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2843
    # this field to determine what to do in filectxfn.
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2844
    _returnnoneformissingfiles = True
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2845
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2846
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2847
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2848
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2849
        parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2850
        text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2851
        files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2852
        filectxfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2853
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2854
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2855
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2856
        branch=None,
44023
3216cabffd4a commit: change default `editor` parameter to None
Matt Harbison <matt_harbison@yahoo.com>
parents: 44009
diff changeset
  2857
        editor=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2858
    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2859
        super(memctx, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2860
            repo, text, user, date, extra, branch=branch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2861
        )
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2862
        self._rev = None
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2863
        self._node = None
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2864
        parents = [(p or self._repo.nodeconstants.nullid) for p in parents]
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2865
        p1, p2 = parents
37173
05ff1a155a21 memctx: create parent contexts using "repo[p]" syntax
Martin von Zweigbergk <martinvonz@google.com>
parents: 37171
diff changeset
  2866
        self._parents = [self._repo[p] for p in (p1, p2)]
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8207
diff changeset
  2867
        files = sorted(set(files))
23587
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2868
        self._files = files
21938
c8411fb5dfef memctx: substate needs to be {} instead of None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21895
diff changeset
  2869
        self.substate = {}
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2870
32765
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32764
diff changeset
  2871
        if isinstance(filectxfn, patch.filestore):
32781
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32765
diff changeset
  2872
            filectxfn = memfilefrompatch(filectxfn)
32765
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32764
diff changeset
  2873
        elif not callable(filectxfn):
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32764
diff changeset
  2874
            # if store is not callable, wrap it in a function
32781
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32765
diff changeset
  2875
            filectxfn = memfilefromctx(filectxfn)
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32765
diff changeset
  2876
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32765
diff changeset
  2877
        # memoizing increases performance for e.g. vcs convert scenarios.
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32765
diff changeset
  2878
        self._filectxfn = makecachingfilectxfn(filectxfn)
22072
443ef664fb55 memctx: create a filectxfn if it is not callable
Sean Farley <sean.michael.farley@gmail.com>
parents: 22055
diff changeset
  2879
21238
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2880
        if editor:
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2881
            self._text = editor(self._repo, self, [])
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2882
            self._repo.savecommitmessage(self._text)
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2883
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2884
    def filectx(self, path, filelog=None):
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22207
diff changeset
  2885
        """get a file context from the working directory
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22207
diff changeset
  2886
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22207
diff changeset
  2887
        Returns None if file doesn't exist and should be removed."""
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2888
        return self._filectxfn(self._repo, self, path)
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2889
11151
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2890
    def commit(self):
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2891
        """commit context to the repo"""
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2892
        return self._repo.commitctx(self)
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2893
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2894
    @propertycache
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2895
    def _manifest(self):
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2896
        """generate a manifest based on the return values of filectxfn"""
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2897
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2898
        # keep this simple for now; just worry about p1
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2899
        pctx = self._parents[0]
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2900
        man = pctx.manifest().copy()
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2901
23603
d74eb8d477d5 memctx: calculate manifest more efficiently
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23602
diff changeset
  2902
        for f in self._status.modified:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2903
            man[f] = self._repo.nodeconstants.modifiednodeid
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2904
23588
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2905
        for f in self._status.added:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  2906
            man[f] = self._repo.nodeconstants.addednodeid
23588
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2907
23589
200215cdf7aa memctx: calculate manifest correctly with newly-removed files (issue4470)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23588
diff changeset
  2908
        for f in self._status.removed:
200215cdf7aa memctx: calculate manifest correctly with newly-removed files (issue4470)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23588
diff changeset
  2909
            if f in man:
200215cdf7aa memctx: calculate manifest correctly with newly-removed files (issue4470)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23588
diff changeset
  2910
                del man[f]
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2911
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2912
        return man
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2913
23587
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2914
    @propertycache
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2915
    def _status(self):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45896
diff changeset
  2916
        """Calculate exact status from ``files`` specified at construction"""
23587
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2917
        man1 = self.p1().manifest()
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2918
        p2 = self._parents[1]
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2919
        # "1 < len(self._parents)" can't be used for checking
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2920
        # existence of the 2nd parent, because "memctx._parents" is
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2921
        # explicitly initialized by the list, of which length is 2.
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46842
diff changeset
  2922
        if p2.rev() != nullrev:
23587
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2923
            man2 = p2.manifest()
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2924
            managing = lambda f: f in man1 or f in man2
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2925
        else:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2926
            managing = lambda f: f in man1
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2927
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2928
        modified, added, removed = [], [], []
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2929
        for f in self._files:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2930
            if not managing(f):
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2931
                added.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2932
            elif self[f]:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2933
                modified.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2934
            else:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2935
                removed.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2936
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2937
        return scmutil.status(modified, added, removed, [], [], [], [])
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2938
45089
d085fcb11c56 memctx: make `parents()` return list of one element if it’s not a merge
Manuel Jacob <me@manueljacob.de>
parents: 45088
diff changeset
  2939
    def parents(self):
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46842
diff changeset
  2940
        if self._parents[1].rev() == nullrev:
45089
d085fcb11c56 memctx: make `parents()` return list of one element if it’s not a merge
Manuel Jacob <me@manueljacob.de>
parents: 45088
diff changeset
  2941
            return [self._parents[0]]
d085fcb11c56 memctx: make `parents()` return list of one element if it’s not a merge
Manuel Jacob <me@manueljacob.de>
parents: 45088
diff changeset
  2942
        return self._parents
d085fcb11c56 memctx: make `parents()` return list of one element if it’s not a merge
Manuel Jacob <me@manueljacob.de>
parents: 45088
diff changeset
  2943
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2944
21688
cc677803bad4 memfilectx: inherit from committablefilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21687
diff changeset
  2945
class memfilectx(committablefilectx):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2946
    """memfilectx represents an in-memory file to commit.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2947
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23110
diff changeset
  2948
    See memctx and committablefilectx for more details.
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2949
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2950
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2951
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2952
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2953
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2954
        changectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2955
        path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2956
        data,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2957
        islink=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2958
        isexec=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2959
        copysource=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  2960
    ):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2961
        """
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2962
        path is the normalized file path relative to repository root.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2963
        data is the file content as a string.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2964
        islink is True if the file is a symbolic link.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2965
        isexec is True if the file is executable.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2966
        copied is the source file path if current file was copied in the
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2967
        revision being committed, or None."""
35400
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35353
diff changeset
  2968
        super(memfilectx, self).__init__(repo, path, None, changectx)
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2969
        self._data = data
38761
d558e53cd6b6 context: safegaurd against 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38755
diff changeset
  2970
        if islink:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2971
            self._flags = b'l'
38761
d558e53cd6b6 context: safegaurd against 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38755
diff changeset
  2972
        elif isexec:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2973
            self._flags = b'x'
38761
d558e53cd6b6 context: safegaurd against 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38755
diff changeset
  2974
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2975
            self._flags = b''
41995
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2976
        self._copysource = copysource
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2977
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2978
    def copysource(self):
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2979
        return self._copysource
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2980
40986
328557af18eb context: reimplement memfilectx.cmp()
Yuya Nishihara <yuya@tcha.org>
parents: 40816
diff changeset
  2981
    def cmp(self, fctx):
328557af18eb context: reimplement memfilectx.cmp()
Yuya Nishihara <yuya@tcha.org>
parents: 40816
diff changeset
  2982
        return self.data() != fctx.data()
328557af18eb context: reimplement memfilectx.cmp()
Yuya Nishihara <yuya@tcha.org>
parents: 40816
diff changeset
  2983
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2984
    def data(self):
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2985
        return self._data
22074
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2986
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2987
    def remove(self, ignoremissing=False):
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2988
        """wraps unlink for a repo's working directory"""
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2989
        # need to figure out what to do here
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2990
        del self._changectx[self._path]
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2991
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2992
    def write(self, data, flags, **kwargs):
22074
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2993
        """wraps repo.wwrite"""
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2994
        self._data = data
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  2995
32243
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32242
diff changeset
  2996
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  2997
class metadataonlyctx(committablectx):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  2998
    """Like memctx but it's reusing the manifest of different commit.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  2999
    Intended to be used by lightweight operations that are creating
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3000
    metadata-only changes.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3001
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3002
    Revision information is supplied at initialization time.  'repo' is the
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3003
    current localrepo, 'ctx' is original revision which manifest we're reuisng
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3004
    'parents' is a sequence of two parent revisions identifiers (pass None for
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3005
    every missing parent), 'text' is the commit.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3006
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3007
    user receives the committer name and defaults to current repository
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3008
    username, date is the commit date in any format supported by
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36411
diff changeset
  3009
    dateutil.parsedate() and defaults to current date, extra is a dictionary of
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3010
    metadata or is left empty.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3011
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3012
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3013
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3014
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3015
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3016
        originalctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3017
        parents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3018
        text=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3019
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3020
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3021
        extra=None,
44023
3216cabffd4a commit: change default `editor` parameter to None
Matt Harbison <matt_harbison@yahoo.com>
parents: 44009
diff changeset
  3022
        editor=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3023
    ):
33998
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3024
        if text is None:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3025
            text = originalctx.description()
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3026
        super(metadataonlyctx, self).__init__(repo, text, user, date, extra)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3027
        self._rev = None
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3028
        self._node = None
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3029
        self._originalctx = originalctx
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3030
        self._manifestnode = originalctx.manifestnode()
33998
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3031
        if parents is None:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3032
            parents = originalctx.parents()
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3033
        else:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3034
            parents = [repo[p] for p in parents if p is not None]
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3035
        parents = parents[:]
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3036
        while len(parents) < 2:
46842
ad878e3f282b refactor: prefer lookup by revision, even for null
Joerg Sonnenberger <joerg@bec.de>
parents: 46819
diff changeset
  3037
            parents.append(repo[nullrev])
33998
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33937
diff changeset
  3038
        p1, p2 = self._parents = parents
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3039
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3040
        # sanity check to ensure that the reused manifest parents are
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3041
        # manifests of our commit parents
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3042
        mp1, mp2 = self.manifestctx().parents
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  3043
        if p1 != self._repo.nodeconstants.nullid and p1.manifestnode() != mp1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3044
            raise RuntimeError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3045
                r"can't reuse the manifest: its p1 "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3046
                r"doesn't match the new ctx p1"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3047
            )
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46843
diff changeset
  3048
        if p2 != self._repo.nodeconstants.nullid and p2.manifestnode() != mp2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3049
            raise RuntimeError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3050
                r"can't reuse the manifest: "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3051
                r"its p2 doesn't match the new ctx p2"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3052
            )
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3053
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3054
        self._files = originalctx.files()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3055
        self.substate = {}
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3056
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3057
        if editor:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3058
            self._text = editor(self._repo, self, [])
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3059
            self._repo.savecommitmessage(self._text)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3060
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3061
    def manifestnode(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3062
        return self._manifestnode
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3063
32519
6ae068f801e3 context: do not cache manifestctx
Jun Wu <quark@fb.com>
parents: 32486
diff changeset
  3064
    @property
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3065
    def _manifestctx(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3066
        return self._repo.manifestlog[self._manifestnode]
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3067
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3068
    def filectx(self, path, filelog=None):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3069
        return self._originalctx.filectx(path, filelog=filelog)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3070
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3071
    def commit(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3072
        """commit context to the repo"""
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3073
        return self._repo.commitctx(self)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3074
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3075
    @property
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3076
    def _manifest(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3077
        return self._originalctx.manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3078
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3079
    @propertycache
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3080
    def _status(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3081
        """Calculate exact status from ``files`` specified in the ``origctx``
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3082
        and parents manifests.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3083
        """
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3084
        man1 = self.p1().manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3085
        p2 = self._parents[1]
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3086
        # "1 < len(self._parents)" can't be used for checking
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3087
        # existence of the 2nd parent, because "metadataonlyctx._parents" is
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3088
        # explicitly initialized by the list, of which length is 2.
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46842
diff changeset
  3089
        if p2.rev() != nullrev:
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3090
            man2 = p2.manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3091
            managing = lambda f: f in man1 or f in man2
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3092
        else:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3093
            managing = lambda f: f in man1
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3094
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3095
        modified, added, removed = [], [], []
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3096
        for f in self._files:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3097
            if not managing(f):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3098
                added.append(f)
33999
be814edf3306 metadataonlyctx: don't crash when reusing the manifest with deletions
Jun Wu <quark@fb.com>
parents: 33998
diff changeset
  3099
            elif f in self:
30567
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3100
                modified.append(f)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3101
            else:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3102
                removed.append(f)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3103
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30361
diff changeset
  3104
        return scmutil.status(modified, added, removed, [], [], [], [])
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3105
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3106
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
  3107
class arbitraryfilectx:
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3108
    """Allows you to use filectx-like functions on a file in an arbitrary
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3109
    location on disk, possibly not in the working directory.
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3110
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43023
diff changeset
  3111
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3112
    def __init__(self, path, repo=None):
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3113
        # Repo is optional because contrib/simplemerge uses this class.
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3114
        self._repo = repo
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3115
        self._path = path
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3116
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3117
    def cmp(self, fctx):
34835
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  3118
        # filecmp follows symlinks whereas `cmp` should not, so skip the fast
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  3119
        # path if either side is a symlink.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3120
        symlinks = b'l' in self.flags() or b'l' in fctx.flags()
34835
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  3121
        if not symlinks and isinstance(fctx, workingfilectx) and self._repo:
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3122
            # Add a fast-path for merge if both sides are disk-backed.
34835
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  3123
            # Note that filecmp uses the opposite return values (True if same)
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  3124
            # from our cmp functions (True if different).
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3125
            return not filecmp.cmp(self.path(), self._repo.wjoin(fctx.path()))
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3126
        return self.data() != fctx.data()
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3127
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3128
    def path(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3129
        return self._path
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3130
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3131
    def flags(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3132
        return b''
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3133
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3134
    def data(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3135
        return util.readfile(self._path)
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3136
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3137
    def decodeddata(self):
48673
576040155dba arbitraryfilectx: use our existing helpers for reading and writing files
Martin von Zweigbergk <martinvonz@google.com>
parents: 48395
diff changeset
  3138
        return util.readfile(self._path)
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3139
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3140
    def remove(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3141
        util.unlink(self._path)
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3142
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  3143
    def write(self, data, flags, **kwargs):
34051
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34037
diff changeset
  3144
        assert not flags
48673
576040155dba arbitraryfilectx: use our existing helpers for reading and writing files
Martin von Zweigbergk <martinvonz@google.com>
parents: 48395
diff changeset
  3145
        util.writefile(self._path, data)