mercurial/context.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 09 Feb 2020 01:34:37 +0100
branchstable
changeset 44175 ee0959e7d435
parent 44109 98349eddceef
child 44310 beea86e4d332
permissions -rw-r--r--
remotefilelog-test: glob some flaky output line (issue6083) The two following lines are flaky underload, yet the final result is correct. The command involves background pre-check of output, these are not stable probably because they run in parallel in multiple process. I spent a couple of hours trying to understand the pattern and gave up. The documented intend of these tests is safely guaranteed by checking the cache content after the command. If it become useful to start testing precise internal details of the, they will have to be tested in a more appropriate framework than `.t` tests. Differential Revision: https://phab.mercurial-scm.org/D8102
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
#
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4417
diff changeset
     3
# Copyright 2006, 2007 Matt Mackall <mpm@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
from __future__ import absolute_import
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
     9
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    10
import errno
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
    11
import filecmp
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    12
import os
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    13
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
    14
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    15
from .i18n import _
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    16
from .node import (
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30370
diff changeset
    17
    addednodeid,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    18
    hex,
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30370
diff changeset
    19
    modifiednodeid,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    20
    nullid,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    21
    nullrev,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    22
    short,
37448
d7114f883505 node: rename wdirnodes to clarify they are for manifest/filelogs
Yuya Nishihara <yuya@tcha.org>
parents: 37447
diff changeset
    23
    wdirfilenodeids,
41972
21cc92fea2aa context: use wdirhex constant instead of calculating it
Martin von Zweigbergk <martinvonz@google.com>
parents: 41954
diff changeset
    24
    wdirhex,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    25
)
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    26
from .pycompat import (
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    27
    getattr,
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    28
    open,
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    29
)
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    30
from . import (
42729
3cffc7bbec26 copies: extract an explicit `computechangesetcopie` method from context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42606
diff changeset
    31
    copies,
36923
7affcabf561e dagop: move annotateline and _annotatepair from context.py
Yuya Nishihara <yuya@tcha.org>
parents: 36789
diff changeset
    32
    dagop,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    33
    encoding,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    34
    error,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    35
    fileset,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    36
    match as matchmod,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    37
    obsolete as obsmod,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    38
    patch,
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
    39
    pathutil,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    40
    phases,
31352
ff2f90503d64 context: work around `long` not existing on Python 3
Augie Fackler <augie@google.com>
parents: 31318
diff changeset
    41
    pycompat,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    42
    repoview,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    43
    scmutil,
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
    44
    sparse,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    45
    subrepo,
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35930
diff changeset
    46
    subrepoutil,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    47
    util,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    48
)
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    49
from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    50
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    51
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    52
)
3122
da85145d4571 filectx: add rename traversal for parents()
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
    53
8207
dd8d5be57d65 util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents: 8157
diff changeset
    54
propertycache = util.propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
    55
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
    56
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
    57
class basectx(object):
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
    58
    """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
    59
    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
    60
    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
    61
                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
    62
    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
    63
            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
    64
37177
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37176
diff changeset
    65
    def __init__(self, repo):
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37176
diff changeset
    66
        self._repo = repo
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37176
diff changeset
    67
31353
c99371e38e5e context: implement both __bytes__ and __str__ for Python 3
Augie Fackler <augie@google.com>
parents: 31352
diff changeset
    68
    def __bytes__(self):
19540
7b864da00e21 basectx: move __str__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19539
diff changeset
    69
        return short(self.node())
7b864da00e21 basectx: move __str__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19539
diff changeset
    70
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
    71
    __str__ = encoding.strmethod(__bytes__)
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
    72
19546
a45cf68dd9a2 basectx: move __repr__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19545
diff changeset
    73
    def __repr__(self):
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43346
diff changeset
    74
        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
    75
19547
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    76
    def __eq__(self, other):
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    77
        try:
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    78
            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
    79
        except AttributeError:
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    80
            return False
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    81
19548
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    82
    def __ne__(self, other):
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    83
        return not (self == other)
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    84
19550
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    85
    def __contains__(self, key):
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    86
        return key in self._manifest
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    87
19551
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    88
    def __getitem__(self, key):
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    89
        return self.filectx(key)
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    90
19552
6b76070c4b54 basectx: move __iter__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19551
diff changeset
    91
    def __iter__(self):
24227
8ec2df32bd39 context: don't sort manifest entries
Augie Fackler <augie@google.com>
parents: 24213
diff changeset
    92
        return iter(self._manifest)
19552
6b76070c4b54 basectx: move __iter__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19551
diff changeset
    93
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
    94
    def _buildstatusmanifest(self, status):
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
    95
        """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: 31270
diff changeset
    96
        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: 31270
diff changeset
    97
        the normal manifest."""
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
    98
        return self.manifest()
21880
e6754f5e4cf7 context: generate filtered manifest efficiently for exact matchers
Siddharth Agarwal <sid0@fb.com>
parents: 21845
diff changeset
    99
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
   100
    def _matchstatus(self, other, match):
33954
c714e82b9ac2 context: always pass a matcher into _matchstatus() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33919
diff changeset
   101
        """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
   102
        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
   103
        """
33954
c714e82b9ac2 context: always pass a matcher into _matchstatus() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33919
diff changeset
   104
        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
   105
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   106
    def _buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   107
        self, other, s, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   108
    ):
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   109
        """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
   110
        # 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
   111
        # 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
   112
        # 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
   113
        # 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
   114
        # 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
   115
        # delta application.
31270
aac054e5389b context: remove assumptions about manifest creation during _buildstatus
Durham Goode <durham@fb.com>
parents: 31269
diff changeset
   116
        mf2 = None
23238
39eb9f78f968 context.status: move manifest caching trick to _buildstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23237
diff changeset
   117
        if self.rev() is not None and self.rev() < other.rev():
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   118
            mf2 = self._buildstatusmanifest(s)
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   119
        mf1 = other._buildstatusmanifest(s)
31270
aac054e5389b context: remove assumptions about manifest creation during _buildstatus
Durham Goode <durham@fb.com>
parents: 31269
diff changeset
   120
        if mf2 is None:
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   121
            mf2 = self._buildstatusmanifest(s)
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   122
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   123
        modified, added = [], []
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   124
        removed = []
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   125
        clean = []
23304
dd3f857598a0 context.status: pass status tuple into _buildstatus
Martin von Zweigbergk <martinvonz@google.com>
parents: 23303
diff changeset
   126
        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
   127
        deletedset = set(deleted)
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   128
        d = mf1.diff(mf2, match=match, clean=listclean)
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   129
        for fn, value in pycompat.iteritems(d):
23731
ccbaa2ed11a4 status: don't list files as both clean and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23730
diff changeset
   130
            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
   131
                continue
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   132
            if value is None:
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   133
                clean.append(fn)
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   134
                continue
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   135
            (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
   136
            if node1 is None:
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   137
                added.append(fn)
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   138
            elif node2 is None:
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   139
                removed.append(fn)
27749
215b47449e47 context: check for differing flags a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 27748
diff changeset
   140
            elif flag1 != flag2:
215b47449e47 context: check for differing flags a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 27748
diff changeset
   141
                modified.append(fn)
37448
d7114f883505 node: rename wdirnodes to clarify they are for manifest/filelogs
Yuya Nishihara <yuya@tcha.org>
parents: 37447
diff changeset
   142
            elif node2 not in 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
   143
                # 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
   144
                # 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
   145
                # 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
   146
                # to a file as a modification.
27747
54522bbe1597 status: back out changeset 89f49813526c
Martin von Zweigbergk <martinvonz@google.com>
parents: 27720
diff changeset
   147
                modified.append(fn)
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   148
            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
   149
                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
   150
            else:
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   151
                clean.append(fn)
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   152
21971
412ac613fd89 status: explicitly exclude removed file from unknown and ignored
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21938
diff changeset
   153
        if removed:
412ac613fd89 status: explicitly exclude removed file from unknown and ignored
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21938
diff changeset
   154
            # need to filter files if they are already reported as removed
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   155
            unknown = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   156
                fn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   157
                for fn in unknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   158
                if fn not in mf1 and (not match or match(fn))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   159
            ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   160
            ignored = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   161
                fn
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   162
                for fn in ignored
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   163
                if fn not in mf1 and (not match or match(fn))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   164
            ]
23730
4b56219a5ac2 status: don't list files as both removed and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23712
diff changeset
   165
            # 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
   166
            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
   167
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   168
        return scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   169
            modified, added, removed, deleted, unknown, ignored, clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   170
        )
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   171
19549
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   172
    @propertycache
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   173
    def substate(self):
36047
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35930
diff changeset
   174
        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
   175
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
   176
    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
   177
        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
   178
19541
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   179
    def rev(self):
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   180
        return self._rev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   181
19542
bd95621a2d56 basectx: move node from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19541
diff changeset
   182
    def node(self):
bd95621a2d56 basectx: move node from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19541
diff changeset
   183
        return self._node
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   184
19543
18f4951222f4 basectx: move hex from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19542
diff changeset
   185
    def hex(self):
19544
74924fa3236d basectx: change _node to node() in hex
Sean Farley <sean.michael.farley@gmail.com>
parents: 19543
diff changeset
   186
        return hex(self.node())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   187
19553
64a99d972b9e basectx: move manifest from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19552
diff changeset
   188
    def manifest(self):
64a99d972b9e basectx: move manifest from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19552
diff changeset
   189
        return self._manifest
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   190
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   191
    def manifestctx(self):
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   192
        return self._manifestctx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   193
24300
a07314472a80 context: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24227
diff changeset
   194
    def repo(self):
a07314472a80 context: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24227
diff changeset
   195
        return self._repo
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   196
19554
98f8875f4baa basectx: move phasestr from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19553
diff changeset
   197
    def phasestr(self):
98f8875f4baa basectx: move phasestr from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19553
diff changeset
   198
        return phases.phasenames[self.phase()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   199
19555
613b70fedc4e basectx: move mutable from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19554
diff changeset
   200
    def mutable(self):
613b70fedc4e basectx: move mutable from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19554
diff changeset
   201
        return self.phase() > phases.public
19541
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   202
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
   203
    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: 43968
diff changeset
   204
        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
   205
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   206
    def obsolete(self):
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   207
        """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
   208
        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
   209
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   210
    def extinct(self):
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   211
        """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
   212
        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
   213
33753
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   214
    def orphan(self):
39319
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39228
diff changeset
   215
        """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
   216
        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
   217
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   218
    def phasedivergent(self):
39319
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39228
diff changeset
   219
        """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
   220
39319
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39228
diff changeset
   221
        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
   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'phasedivergent')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   224
33754
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   225
    def contentdivergent(self):
39319
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39228
diff changeset
   226
        """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
   227
39319
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39228
diff changeset
   228
        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
   229
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
        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
   231
33756
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33755
diff changeset
   232
    def isunstable(self):
39319
f6f52841e1ff context: use new names for unstable changesets in docstrings
Anton Shestakov <av6@dwimlabs.net>
parents: 39228
diff changeset
   233
        """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: 39228
diff changeset
   234
        content-divergent"""
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   235
        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
   236
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   237
    def instabilities(self):
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   238
        """return the list of instabilities affecting this changeset.
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   239
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   240
        Instabilities are returned as strings. possible values are:
33695
03039ff3082b evolution: rename unstable to orphan
Boris Feld <boris.feld@octobus.net>
parents: 33501
diff changeset
   241
        - orphan,
33715
9c27a2891b75 evolution: rename bumped to phase-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33714
diff changeset
   242
        - phase-divergent,
33714
2194a8723138 evolution: rename divergent to content-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33695
diff changeset
   243
        - content-divergent.
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   244
        """
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   245
        instabilities = []
33753
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   246
        if self.orphan():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
            instabilities.append(b'orphan')
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   248
        if self.phasedivergent():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   249
            instabilities.append(b'phase-divergent')
33754
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   250
        if self.contentdivergent():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   251
            instabilities.append(b'content-divergent')
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   252
        return instabilities
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   253
19556
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   254
    def parents(self):
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   255
        """return contexts for each parent changeset"""
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   256
        return self._parents
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   257
19557
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   258
    def p1(self):
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   259
        return self._parents[0]
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   260
19558
d0448e9d4554 basectx: move p2 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19557
diff changeset
   261
    def p2(self):
27064
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   262
        parents = self._parents
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   263
        if len(parents) == 2:
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   264
            return parents[1]
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
   265
        return self._repo[nullrev]
19558
d0448e9d4554 basectx: move p2 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19557
diff changeset
   266
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   267
    def _fileinfo(self, path):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   268
        if '_manifest' in self.__dict__:
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   269
            try:
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   270
                return self._manifest[path], self._manifest.flags(path)
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   271
            except KeyError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   272
                raise error.ManifestLookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   273
                    self._node, path, _(b'not found in manifest')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   274
                )
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   275
        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
   276
            if path in self._manifestdelta:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   277
                return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   278
                    self._manifestdelta[path],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   279
                    self._manifestdelta.flags(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   280
                )
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   281
        mfl = self._repo.manifestlog
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   282
        try:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   283
            node, flag = mfl[self._changeset.manifest].find(path)
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   284
        except KeyError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   285
            raise error.ManifestLookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
                self._node, path, _(b'not found in manifest')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   287
            )
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   288
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   289
        return node, flag
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   290
19560
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   291
    def filenode(self, path):
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   292
        return self._fileinfo(path)[0]
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   293
19561
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   294
    def flags(self, path):
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   295
        try:
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   296
            return self._fileinfo(path)[1]
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   297
        except error.LookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   298
            return b''
19561
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   299
42318
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   300
    @propertycache
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   301
    def _copies(self):
42729
3cffc7bbec26 copies: extract an explicit `computechangesetcopie` method from context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42606
diff changeset
   302
        return copies.computechangesetcopies(self)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   303
42318
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   304
    def p1copies(self):
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   305
        return self._copies[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   306
42318
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   307
    def p2copies(self):
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   308
        return self._copies[1]
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
   309
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28488
diff changeset
   310
    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
   311
        '''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
   312
        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
   313
25417
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   314
    def nullsub(self, path, pctx):
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   315
        return subrepo.nullsubrepo(self, path, pctx)
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   316
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   317
    def workingsub(self, path):
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   318
        '''return a subrepo for the stored revision, or wdir if this is a wdir
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   319
        context.
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   320
        '''
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   321
        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
   322
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   323
    def match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   324
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   325
        pats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   326
        include=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   327
        exclude=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   328
        default=b'glob',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   329
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   330
        badfn=None,
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
   331
        cwd=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   332
    ):
19563
87503cd824fa basectx: move match from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19562
diff changeset
   333
        r = self._repo
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
   334
        if not cwd:
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
   335
            cwd = r.getcwd()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   336
        return matchmod.match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   337
            r.root,
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
   338
            cwd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   339
            pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   340
            include,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   341
            exclude,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   342
            default,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   343
            auditor=r.nofsauditor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   344
            ctx=self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   345
            listsubrepos=listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   346
            badfn=badfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   347
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   348
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   349
    def diff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   350
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   351
        ctx2=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   352
        match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   353
        changes=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   354
        opts=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   355
        losedatafn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   356
        pathfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   357
        copy=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   358
        copysourcematch=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   359
        hunksfilterfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   360
    ):
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   361
        """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
   362
        if ctx2 is None:
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   363
            ctx2 = self.p1()
19568
f58235d85d6b basectx: remove unnecessary check of instance
Sean Farley <sean.michael.farley@gmail.com>
parents: 19567
diff changeset
   364
        if ctx2 is not None:
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   365
            ctx2 = self._repo[ctx2]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   366
        return patch.diff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   367
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   368
            ctx2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   369
            self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   370
            match=match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   371
            changes=changes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   372
            opts=opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   373
            losedatafn=losedatafn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   374
            pathfn=pathfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   375
            copy=copy,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   376
            copysourcematch=copysourcematch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   377
            hunksfilterfn=hunksfilterfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   378
        )
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   379
24323
4c7c6beade1a manifest: have context's dirs() call its manifest's dirs()
Drew Gottlieb <drgott@google.com>
parents: 24306
diff changeset
   380
    def dirs(self):
4c7c6beade1a manifest: have context's dirs() call its manifest's dirs()
Drew Gottlieb <drgott@google.com>
parents: 24306
diff changeset
   381
        return self._manifest.dirs()
19565
bd1580a9c133 basectx: move _dirs from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19564
diff changeset
   382
24325
79d9c51488ca manifest: add hasdir() to context
Drew Gottlieb <drgott@google.com>
parents: 24323
diff changeset
   383
    def hasdir(self, dir):
79d9c51488ca manifest: add hasdir() to context
Drew Gottlieb <drgott@google.com>
parents: 24323
diff changeset
   384
        return self._manifest.hasdir(dir)
19566
54817c774d38 basectx: move dirs from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19565
diff changeset
   385
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   386
    def status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   387
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   388
        other=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   389
        match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   390
        listignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   391
        listclean=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   392
        listunknown=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   393
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   394
    ):
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   395
        """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
   396
        directory.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   397
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   398
        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
   399
ee29b0bb1619 status: document the content of the returned tuple in the docstring
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21718
diff changeset
   400
        returns (modified, added, removed, deleted, unknown, ignored, clean)
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   401
        """
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   402
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   403
        ctx1 = self
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   404
        ctx2 = self._repo[other]
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
        # 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
   407
        # 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
   408
        # 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
   409
        # with its first parent.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   410
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   411
        # 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
   412
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   413
        # workingctx.status(parentctx)
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   414
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   415
        # 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
   416
        # 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
   417
        # just copy the manifest of the parent.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   418
        reversed = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   419
        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
   420
            reversed = True
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   421
            ctx1, ctx2 = ctx2, ctx1
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   422
40084
48a0ce67d67a status: intersect matcher with narrow matcher instead of filtering afterwards
Martin von Zweigbergk <martinvonz@google.com>
parents: 40063
diff changeset
   423
        match = self._repo.narrowmatch(match)
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
   424
        match = ctx2._matchstatus(ctx1, match)
23304
dd3f857598a0 context.status: pass status tuple into _buildstatus
Martin von Zweigbergk <martinvonz@google.com>
parents: 23303
diff changeset
   425
        r = scmutil.status([], [], [], [], [], [], [])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   426
        r = ctx2._buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   427
            ctx1, r, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   428
        )
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   429
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   430
        if reversed:
23301
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   431
            # 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
   432
            # these make no sense to reverse.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   433
            r = scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   434
                r.modified, r.removed, r.added, [], [], [], r.clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   435
            )
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   436
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   437
        if listsubrepos:
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   438
            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
   439
                try:
27183
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   440
                    rev2 = ctx2.subrev(subpath)
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   441
                except KeyError:
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   442
                    # 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
   443
                    # 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
   444
                    # 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
   445
                    rev2 = None
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27983
diff changeset
   446
                submatch = matchmod.subdirmatcher(subpath, match)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   447
                s = sub.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   448
                    rev2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   449
                    match=submatch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   450
                    ignored=listignored,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   451
                    clean=listclean,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   452
                    unknown=listunknown,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   453
                    listsubrepos=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   454
                )
43691
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   455
                for k in (
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   456
                    'modified',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   457
                    'added',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   458
                    'removed',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   459
                    'deleted',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   460
                    'unknown',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   461
                    'ignored',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   462
                    'clean',
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   463
                ):
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   464
                    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
   465
                    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
   466
43691
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   467
        r.modified.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   468
        r.added.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   469
        r.removed.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   470
        r.deleted.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   471
        r.unknown.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   472
        r.ignored.sort()
e035a8f71d52 context: use field names instead of field numbers on scmutil.status
Augie Fackler <augie@google.com>
parents: 43677
diff changeset
   473
        r.clean.sort()
21616
0a8e7f81e8ae context: explicitly return a tuple
Sean Farley <sean.michael.farley@gmail.com>
parents: 21595
diff changeset
   474
23301
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   475
        return r
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   476
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   477
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
   478
class changectx(basectx):
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   479
    """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
   480
    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
   481
    the repo."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   482
43780
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   483
    def __init__(self, repo, rev, node, maybe_filtered=True):
37177
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37176
diff changeset
   484
        super(changectx, self).__init__(repo)
39959
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39958
diff changeset
   485
        self._rev = rev
3d35304bd09b context: move logic from changectx.__init__ to localrepo.__getitem__ (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 39958
diff changeset
   486
        self._node = node
43780
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   487
        # 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: 43691
diff changeset
   488
        # 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: 43691
diff changeset
   489
        #
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   490
        # 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: 43691
diff changeset
   491
        # 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: 43691
diff changeset
   492
        # 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: 43691
diff changeset
   493
        self._maybe_filtered = maybe_filtered
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   494
6469
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   495
    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
   496
        try:
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   497
            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
   498
        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
   499
            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
   500
3168
05c588e1803d context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents: 3166
diff changeset
   501
    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
   502
        return self._rev != nullrev
3168
05c588e1803d context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents: 3166
diff changeset
   503
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   504
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   505
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   506
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   507
    def _changeset(self):
43780
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   508
        if self._maybe_filtered:
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   509
            repo = self._repo
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   510
        else:
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   511
            repo = self._repo.unfiltered()
1e87851dba63 changectx: add a "maybe filtered" filtered attribute
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43691
diff changeset
   512
        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
   513
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   514
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   515
    def _manifest(self):
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   516
        return self._manifestctx.read()
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   517
32552
6ae068f801e3 context: do not cache manifestctx
Jun Wu <quark@fb.com>
parents: 32519
diff changeset
   518
    @property
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   519
    def _manifestctx(self):
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   520
        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
   521
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   522
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   523
    def _manifestdelta(self):
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   524
        return self._manifestctx.readdelta()
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   525
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   526
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   527
    def _parents(self):
27063
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   528
        repo = self._repo
43784
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43780
diff changeset
   529
        if self._maybe_filtered:
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43780
diff changeset
   530
            cl = repo.changelog
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43780
diff changeset
   531
        else:
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43780
diff changeset
   532
            cl = repo.unfiltered().changelog
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43780
diff changeset
   533
f9068413bd0c changectx: use unfiltered changelog to access parents of unfiltered revs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43780
diff changeset
   534
        p1, p2 = cl.parentrevs(self._rev)
27063
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   535
        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
   536
            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
   537
        return [
98349eddceef changectx: mark parent of changesets as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44108
diff changeset
   538
            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
   539
            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
   540
        ]
3215
931288cf58a7 contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents: 3214
diff changeset
   541
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   542
    def changeset(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   543
        c = self._changeset
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   544
        return (
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   545
            c.manifest,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   546
            c.user,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   547
            c.date,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   548
            c.files,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   549
            c.description,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   550
            c.extra,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   551
        )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   552
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   553
    def manifestnode(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   554
        return self._changeset.manifest
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   555
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   556
    def user(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   557
        return self._changeset.user
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   558
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   559
    def date(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   560
        return self._changeset.date
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   561
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   562
    def files(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   563
        return self._changeset.files
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   564
42396
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   565
    def filesmodified(self):
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   566
        modified = set(self.files())
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   567
        modified.difference_update(self.filesadded())
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   568
        modified.difference_update(self.filesremoved())
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   569
        return sorted(modified)
43023
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42865
diff changeset
   570
42396
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   571
    def filesadded(self):
43023
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42865
diff changeset
   572
        filesadded = self._changeset.filesadded
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   573
        compute_on_none = True
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   574
        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
   575
            compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   576
        else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   577
            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
   578
            if source == b'changeset-only':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   579
                compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   580
            elif source != b'compatibility':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   581
                # 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
   582
                filesadded = None
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   583
        if filesadded is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   584
            if compute_on_none:
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
   585
                filesadded = copies.computechangesetfilesadded(self)
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   586
            else:
43023
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42865
diff changeset
   587
                filesadded = []
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42865
diff changeset
   588
        return filesadded
008e74b34fb7 context: clarify the various mode in the filesadded method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42865
diff changeset
   589
42396
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   590
    def filesremoved(self):
43024
15badd621825 context: clarify the various mode in the filesremoved method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43023
diff changeset
   591
        filesremoved = self._changeset.filesremoved
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   592
        compute_on_none = True
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   593
        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
   594
            compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   595
        else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   596
            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
   597
            if source == b'changeset-only':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   598
                compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   599
            elif source != b'compatibility':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   600
                # 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
   601
                filesremoved = None
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   602
        if filesremoved is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   603
            if compute_on_none:
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
   604
                filesremoved = copies.computechangesetfilesremoved(self)
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   605
            else:
43024
15badd621825 context: clarify the various mode in the filesremoved method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43023
diff changeset
   606
                filesremoved = []
15badd621825 context: clarify the various mode in the filesremoved method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43023
diff changeset
   607
        return filesremoved
42396
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
   608
41764
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
   609
    @propertycache
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
   610
    def _copies(self):
42142
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42102
diff changeset
   611
        p1copies = self._changeset.p1copies
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42102
diff changeset
   612
        p2copies = self._changeset.p2copies
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   613
        compute_on_none = True
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   614
        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
   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
        else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   617
            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
   618
            # 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
   619
            # 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
   620
            # 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
   621
            # 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
   622
            # the filelogs (below).
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   623
            #
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   624
            # 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
   625
            # 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
   626
            #
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   627
            # 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
   628
            # copy metadata from the filelogs.
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   629
            if source == b'changeset-only':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   630
                compute_on_none = False
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   631
            elif source != b'compatibility':
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   632
                # 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
   633
                p1copies = p2copies = None
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   634
        if p1copies is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   635
            if compute_on_none:
43025
8af909893188 context: clarify the various mode in the _copies property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
   636
                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
   637
            else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   638
                if p1copies is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   639
                    p1copies = {}
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   640
        if p2copies is None:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   641
            p2copies = {}
43025
8af909893188 context: clarify the various mode in the _copies property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
   642
        return p1copies, p2copies
8af909893188 context: clarify the various mode in the _copies property cache
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43024
diff changeset
   643
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   644
    def description(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   645
        return self._changeset.description
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   646
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   647
    def branch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   648
        return encoding.tolocal(self._changeset.extra.get(b"branch"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   649
16720
e825a89de5d7 context: add changectx.closesbranch() method
Brodie Rao <brodie@sf.io>
parents: 16719
diff changeset
   650
    def closesbranch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   651
        return b'close' in self._changeset.extra
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   652
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   653
    def extra(self):
35130
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   654
        """Return a dict of extra information."""
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   655
        return self._changeset.extra
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   656
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   657
    def tags(self):
35130
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   658
        """Return a list of byte tag names"""
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   659
        return self._repo.nodetags(self._node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   660
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13235
diff changeset
   661
    def bookmarks(self):
35130
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   662
        """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
   663
        return self._repo.nodebookmarks(self._node)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   664
15421
405ca90df2b1 phases: add a phase method to context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15337
diff changeset
   665
    def phase(self):
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16610
diff changeset
   666
        return self._repo._phasecache.phase(self._repo, self._rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   667
14644
f3a40fd7008c hidden: Add ``hidden`` method for context
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14528
diff changeset
   668
    def hidden(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   669
        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
   670
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   671
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   672
        return False
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   673
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   674
    def children(self):
35130
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   675
        """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: 35116
diff changeset
   676
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   677
        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: 35116
diff changeset
   678
        recursively walk children.
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   679
        """
2627
b779319a532b context.py: self.repo is not defined, change to self._repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2566
diff changeset
   680
        c = self._repo.changelog.children(self._node)
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
   681
        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
   682
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   683
    def ancestors(self):
16866
91f3ac205816 revlog: ancestors(*revs) becomes ancestors(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16761
diff changeset
   684
        for a in self._repo.changelog.ancestors([self._rev]):
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
   685
            yield self._repo[a]
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   686
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   687
    def descendants(self):
35130
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   688
        """Recursively yield all children of the changeset.
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   689
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   690
        For just the immediate children, use children()
b22a0d9e0a83 docs: add args/returns docs for some cmdutil, context, and registrar functions
rlevasseur@google.com
parents: 35116
diff changeset
   691
        """
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
   692
        for d in self._repo.changelog.descendants([self._rev]):
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
   693
            yield self._repo[d]
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   694
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
   695
    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
   696
        """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
   697
        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
   698
            fileid = self.filenode(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   699
        return filectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   700
            self._repo, path, fileid=fileid, changectx=self, filelog=filelog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   701
        )
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   702
21203
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   703
    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
   704
        """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
   705
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   706
        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
   707
        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
   708
        revlog ancestor."""
9843
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   709
        # deal with workingctxs
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   710
        n2 = c2._node
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 13001
diff changeset
   711
        if n2 is None:
9843
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   712
            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
   713
        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
   714
        if not cahs:
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   715
            anc = nullid
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   716
        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
   717
            anc = cahs[0]
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   718
        else:
25844
18541e9510c5 merge: make merge.preferancestor type and default consistent
Matt Mackall <mpm@selenic.com>
parents: 25757
diff changeset
   719
            # experimental config: merge.preferancestor
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   720
            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
   721
                try:
37354
a6014392837e context: use revsymbol() in "merge.preferancestor" code
Martin von Zweigbergk <martinvonz@google.com>
parents: 37269
diff changeset
   722
                    ctx = scmutil.revsymbol(self._repo, r)
22671
5220c12c43fd changectx: skip all invalid merge.preferancestor values
Mads Kiilerich <madski@unity3d.com>
parents: 22405
diff changeset
   723
                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
   724
                    continue
21126
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   725
                anc = ctx.node()
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   726
                if anc in cahs:
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   727
                    break
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   728
            else:
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   729
                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
   730
            if warn:
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   731
                self._repo.ui.status(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   732
                    (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   733
                        _(b"note: using %s as ancestor of %s and %s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   734
                        % (short(anc), short(self._node), short(n2))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   735
                    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   736
                    + b''.join(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   737
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   738
                            b"      alternatively, use --config "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   739
                            b"merge.preferancestor=%s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   740
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   741
                        % short(n)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   742
                        for n in sorted(cahs)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   743
                        if n != anc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   744
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   745
                )
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
   746
        return self._repo[anc]
3125
02b22fefc01f changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents: 3124
diff changeset
   747
38670
fbec9c0b32d3 context: rename descendant() to isancestorof()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38668
diff changeset
   748
    def isancestorof(self, other):
fbec9c0b32d3 context: rename descendant() to isancestorof()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38668
diff changeset
   749
        """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
   750
        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
   751
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6763
diff changeset
   752
    def walk(self, match):
24646
5693c834bcb4 manifest: move changectx.walk() to manifests
Drew Gottlieb <drgott@google.com>
parents: 24633
diff changeset
   753
        '''Generates matching file names.'''
20292
8dc254198a8f changectx: increase perf of walk function
Durham Goode <durham@fb.com>
parents: 20236
diff changeset
   754
25435
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   755
        # 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
   756
        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
   757
            # 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
   758
            # paths into valid subrepos.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   759
            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
   760
                return
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   761
            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
   762
40085
2cf18f46a1ce narrow: only walk files within narrowspec also for committed revisions
Martin von Zweigbergk <martinvonz@google.com>
parents: 40084
diff changeset
   763
        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
   764
        return self._manifest.walk(m)
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6763
diff changeset
   765
21985
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
   766
    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
   767
        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
   768
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   769
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
   770
class basefilectx(object):
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
   771
    """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
   772
    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
   773
             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
   774
    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
   775
                    directory,
32283
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
   776
    memfilectx: a filecontext that represents files in-memory,
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
   777
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   778
19573
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   779
    @propertycache
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   780
    def _filelog(self):
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   781
        return self._repo.file(self._path)
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   782
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   783
    @propertycache
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   784
    def _changeid(self):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   785
        if '_changectx' in self.__dict__:
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   786
            return self._changectx.rev()
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   787
        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
   788
            # 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
   789
            # descendant, we can (lazily) correct for linkrev aliases
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   790
            return self._adjustlinkrev(self._descendantrev)
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   791
        else:
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   792
            return self._filelog.linkrev(self._filerev)
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   793
19575
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   794
    @propertycache
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   795
    def _filenode(self):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
   796
        if '_fileid' in self.__dict__:
19575
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   797
            return self._filelog.lookup(self._fileid)
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   798
        else:
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   799
            return self._changectx.filenode(self._path)
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   800
19576
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   801
    @propertycache
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   802
    def _filerev(self):
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   803
        return self._filelog.rev(self._filenode)
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   804
19577
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   805
    @propertycache
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   806
    def _repopath(self):
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   807
        return self._path
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   808
19578
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   809
    def __nonzero__(self):
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   810
        try:
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   811
            self._filenode
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   812
            return True
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   813
        except error.LookupError:
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   814
            # file is missing
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   815
            return False
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   816
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   817
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   818
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
   819
    def __bytes__(self):
30284
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   820
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   821
            return b"%s@%s" % (self.path(), self._changectx)
30284
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   822
        except error.LookupError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   823
            return b"%s@???" % self.path()
19579
964844d64ef8 basefilectx: move __str__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19578
diff changeset
   824
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
   825
    __str__ = encoding.strmethod(__bytes__)
33035
daccadd75760 py3: define __bytes__ for basefilectx class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32922
diff changeset
   826
19580
e86a594ab11f basefilectx: move __repr__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19579
diff changeset
   827
    def __repr__(self):
43551
313e3a279828 cleanup: remove pointless r-prefixes on double-quoted strings
Augie Fackler <augie@google.com>
parents: 43346
diff changeset
   828
        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
   829
19581
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   830
    def __hash__(self):
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   831
        try:
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   832
            return hash((self._path, self._filenode))
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   833
        except AttributeError:
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   834
            return id(self)
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   835
19582
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   836
    def __eq__(self, other):
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   837
        try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   838
            return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   839
                type(self) == type(other)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   840
                and self._path == other._path
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   841
                and self._filenode == other._filenode
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   842
            )
19582
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   843
        except AttributeError:
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   844
            return False
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   845
19583
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   846
    def __ne__(self, other):
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   847
        return not (self == other)
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   848
19584
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   849
    def filerev(self):
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   850
        return self._filerev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   851
19585
8e553cd6071e basefilectx: move filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19584
diff changeset
   852
    def filenode(self):
8e553cd6071e basefilectx: move filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19584
diff changeset
   853
        return self._filenode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   854
32278
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   855
    @propertycache
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   856
    def _flags(self):
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   857
        return self._changectx.flags(self._path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   858
19586
43f9ed2f64b1 basefilectx: move flags from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19585
diff changeset
   859
    def flags(self):
32278
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   860
        return self._flags
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   861
19587
b1c344ebd8e4 basefilectx: move filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19586
diff changeset
   862
    def filelog(self):
b1c344ebd8e4 basefilectx: move filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19586
diff changeset
   863
        return self._filelog
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   864
19588
a192fff6c97d basefilectx: move rev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19587
diff changeset
   865
    def rev(self):
a192fff6c97d basefilectx: move rev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19587
diff changeset
   866
        return self._changeid
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   867
19589
6a9043fa06d0 basefilectx: move linkrev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19588
diff changeset
   868
    def linkrev(self):
6a9043fa06d0 basefilectx: move linkrev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19588
diff changeset
   869
        return self._filelog.linkrev(self._filerev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   870
19590
90994b176bc1 basefilectx: move node from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19589
diff changeset
   871
    def node(self):
90994b176bc1 basefilectx: move node from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19589
diff changeset
   872
        return self._changectx.node()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   873
19591
04fbc85f870a basefilectx: move hex from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19590
diff changeset
   874
    def hex(self):
04fbc85f870a basefilectx: move hex from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19590
diff changeset
   875
        return self._changectx.hex()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   876
19592
1cdb3b3df4df basefilectx: move user from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19591
diff changeset
   877
    def user(self):
1cdb3b3df4df basefilectx: move user from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19591
diff changeset
   878
        return self._changectx.user()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   879
19593
e3c241c89350 basefilectx: move date from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19592
diff changeset
   880
    def date(self):
e3c241c89350 basefilectx: move date from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19592
diff changeset
   881
        return self._changectx.date()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   882
19594
1c030c24e196 basefilectx: move files from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19593
diff changeset
   883
    def files(self):
1c030c24e196 basefilectx: move files from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19593
diff changeset
   884
        return self._changectx.files()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   885
19595
bb6fd06975a6 basefilectx: move description from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19594
diff changeset
   886
    def description(self):
bb6fd06975a6 basefilectx: move description from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19594
diff changeset
   887
        return self._changectx.description()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   888
19596
9bc3d0dea371 basefilectx: move branch from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19595
diff changeset
   889
    def branch(self):
9bc3d0dea371 basefilectx: move branch from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19595
diff changeset
   890
        return self._changectx.branch()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   891
19597
837bc86370f0 basefilectx: move extra from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19596
diff changeset
   892
    def extra(self):
837bc86370f0 basefilectx: move extra from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19596
diff changeset
   893
        return self._changectx.extra()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   894
19598
e8ef893a3150 basefilectx: move phase from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19597
diff changeset
   895
    def phase(self):
e8ef893a3150 basefilectx: move phase from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19597
diff changeset
   896
        return self._changectx.phase()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   897
19599
66d83efac20a basefilectx: move phasestr from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19598
diff changeset
   898
    def phasestr(self):
66d83efac20a basefilectx: move phasestr from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19598
diff changeset
   899
        return self._changectx.phasestr()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   900
35111
a9454beb9dd8 context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 34926
diff changeset
   901
    def obsolete(self):
a9454beb9dd8 context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 34926
diff changeset
   902
        return self._changectx.obsolete()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   903
35116
bd2743936b56 context: add instabilities() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 35111
diff changeset
   904
    def instabilities(self):
bd2743936b56 context: add instabilities() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 35111
diff changeset
   905
        return self._changectx.instabilities()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   906
19600
12cdff44fdc4 basefilectx: move manifest from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19599
diff changeset
   907
    def manifest(self):
12cdff44fdc4 basefilectx: move manifest from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19599
diff changeset
   908
        return self._changectx.manifest()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   909
19601
f284907631f5 basefilectx: move changectx from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19600
diff changeset
   910
    def changectx(self):
f284907631f5 basefilectx: move changectx from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19600
diff changeset
   911
        return self._changectx
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   912
32279
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
   913
    def renamed(self):
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
   914
        return self._copied
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   915
41777
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
   916
    def copysource(self):
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
   917
        return self._copied and self._copied[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   918
24333
5da0eb641881 filectx: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24326
diff changeset
   919
    def repo(self):
5da0eb641881 filectx: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24326
diff changeset
   920
        return self._repo
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   921
32280
842ea95d45dc filectx: move size to basefilectx
Jun Wu <quark@fb.com>
parents: 32279
diff changeset
   922
    def size(self):
842ea95d45dc filectx: move size to basefilectx
Jun Wu <quark@fb.com>
parents: 32279
diff changeset
   923
        return len(self.data())
19584
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   924
19602
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   925
    def path(self):
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   926
        return self._path
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   927
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   928
    def isbinary(self):
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   929
        try:
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
   930
            return stringutil.binary(self.data())
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   931
        except IOError:
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   932
            return False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   933
22054
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   934
    def isexec(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   935
        return b'x' in self.flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   936
22054
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   937
    def islink(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   938
        return b'l' in self.flags()
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   939
26978
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   940
    def isabsent(self):
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   941
        """whether this filectx represents a file not in self._changectx
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   942
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   943
        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
   944
        expected to be True for all subclasses of basectx."""
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   945
        return False
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   946
26977
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   947
    _customcmp = False
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   948
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   949
    def cmp(self, fctx):
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   950
        """compare with other file context
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   951
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   952
        returns True if different than fctx.
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   953
        """
26977
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   954
        if fctx._customcmp:
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   955
            return fctx.cmp(self)
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   956
41001
21ffe6b97a25 context: error out if basefilectx.cmp() is called without self._filenode
Yuya Nishihara <yuya@tcha.org>
parents: 41000
diff changeset
   957
        if self._filenode is None:
21ffe6b97a25 context: error out if basefilectx.cmp() is called without self._filenode
Yuya Nishihara <yuya@tcha.org>
parents: 41000
diff changeset
   958
            raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   959
                b'filectx.cmp() must be reimplemented if not backed by revlog'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
   960
            )
41001
21ffe6b97a25 context: error out if basefilectx.cmp() is called without self._filenode
Yuya Nishihara <yuya@tcha.org>
parents: 41000
diff changeset
   961
41000
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   962
        if fctx._filenode is None:
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   963
            if self._repo._encodefilterpats:
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   964
                # 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: 40999
diff changeset
   965
                return self._filelog.cmp(self._filenode, fctx.data())
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   966
            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: 40999
diff changeset
   967
                # size() can match:
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   968
                # 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: 40999
diff changeset
   969
                # 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: 40999
diff changeset
   970
                return self._filelog.cmp(self._filenode, fctx.data())
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   971
        if self.size() == fctx.size():
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   972
            # size() matches: need to compare content
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   973
            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
   974
41000
39953bcf1f51 context: collapse complex condition to see if filelog have to be compared
Yuya Nishihara <yuya@tcha.org>
parents: 40999
diff changeset
   975
        # size() differs
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   976
        return True
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   977
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
   978
    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
   979
        """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
   980
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   981
        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
   982
        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
   983
        this file revision.
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   984
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   985
        :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
   986
        :inclusive: if true, the src revision will also be checked
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
   987
        :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: 40735
diff changeset
   988
                  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: 40735
diff changeset
   989
                  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: 40735
diff changeset
   990
                  iteration.
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   991
        """
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   992
        repo = self._repo
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   993
        cl = repo.unfiltered().changelog
29943
80be4436e4cc manifest: adds manifestctx.readfast
Durham Goode <durham@fb.com>
parents: 29942
diff changeset
   994
        mfl = repo.manifestlog
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   995
        # fetch the linkrev
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   996
        lkr = self.linkrev()
40045
ccf4d808ec4c context: fast path linkrev adjustement in trivial case
Boris Feld <boris.feld@octobus.net>
parents: 39960
diff changeset
   997
        if srcrev == lkr:
ccf4d808ec4c context: fast path linkrev adjustement in trivial case
Boris Feld <boris.feld@octobus.net>
parents: 39960
diff changeset
   998
            return lkr
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
   999
        # 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
  1000
        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
  1001
        iteranc = None
24411
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1002
        if srcrev is None:
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1003
            # 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
  1004
            revs = [p.rev() for p in self._repo[None].parents()]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1005
            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
  1006
        else:
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
  1007
            revs = [srcrev]
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
  1008
        if memberanc is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1009
            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
  1010
        # 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
  1011
        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
  1012
            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
  1013
                iteranc = cl.ancestors(revs, lkr, inclusive=inclusive)
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
  1014
            fnode = self._filenode
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
  1015
            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
  1016
            for a in iteranc:
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1017
                if stoprev is not None and a < stoprev:
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1018
                    return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1019
                ac = cl.read(a)  # get changeset data (we avoid object creation)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1020
                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
  1021
                    # 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
  1022
                    # similar to the one we search for.
29943
80be4436e4cc manifest: adds manifestctx.readfast
Durham Goode <durham@fb.com>
parents: 29942
diff changeset
  1023
                    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
  1024
                        return a
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1025
            # 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
  1026
            # 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
  1027
            # 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
  1028
            # 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
  1029
        return lkr
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
  1030
40733
8a0136f69027 context: introduce an `isintroducedafter` method and use it in copies
Boris Feld <boris.feld@octobus.net>
parents: 40732
diff changeset
  1031
    def isintroducedafter(self, changelogrev):
8a0136f69027 context: introduce an `isintroducedafter` method and use it in copies
Boris Feld <boris.feld@octobus.net>
parents: 40732
diff changeset
  1032
        """True if a filectx has been introduced after a given floor revision
8a0136f69027 context: introduce an `isintroducedafter` method and use it in copies
Boris Feld <boris.feld@octobus.net>
parents: 40732
diff changeset
  1033
        """
40735
69206452a2ac context: small refactoring of `isintroducedafter`
Boris Feld <boris.feld@octobus.net>
parents: 40734
diff changeset
  1034
        if self.linkrev() >= changelogrev:
69206452a2ac context: small refactoring of `isintroducedafter`
Boris Feld <boris.feld@octobus.net>
parents: 40734
diff changeset
  1035
            return True
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1036
        introrev = self._introrev(stoprev=changelogrev)
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1037
        if introrev is None:
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1038
            return False
40735
69206452a2ac context: small refactoring of `isintroducedafter`
Boris Feld <boris.feld@octobus.net>
parents: 40734
diff changeset
  1039
        return introrev >= changelogrev
40733
8a0136f69027 context: introduce an `isintroducedafter` method and use it in copies
Boris Feld <boris.feld@octobus.net>
parents: 40732
diff changeset
  1040
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1041
    def introrev(self):
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1042
        """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
  1043
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1044
        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
  1045
        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
  1046
        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
  1047
        '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
  1048
        changesets.
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1049
        """
40734
9fa0d6dd1617 context: split `introrev` logic in a sub function
Boris Feld <boris.feld@octobus.net>
parents: 40733
diff changeset
  1050
        return self._introrev()
9fa0d6dd1617 context: split `introrev` logic in a sub function
Boris Feld <boris.feld@octobus.net>
parents: 40733
diff changeset
  1051
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1052
    def _introrev(self, stoprev=None):
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1053
        """
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1054
        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: 40735
diff changeset
  1055
        iteration range in some internal usecase.
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1056
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1057
        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: 40735
diff changeset
  1058
        `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: 40735
diff changeset
  1059
        limit the iteration range.
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1060
        """
40731
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40711
diff changeset
  1061
        toprev = None
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1062
        attrs = vars(self)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1063
        if '_changeid' in attrs:
40731
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40711
diff changeset
  1064
            # We have a cached value already
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40711
diff changeset
  1065
            toprev = self._changeid
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1066
        elif '_changectx' in attrs:
40731
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40711
diff changeset
  1067
            # 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: 40711
diff changeset
  1068
            toprev = self._changectx.rev()
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40711
diff changeset
  1069
f3f4d8537b11 context: spell out the logic around linkrev adjustement starting point
Boris Feld <boris.feld@octobus.net>
parents: 40711
diff changeset
  1070
        if toprev is not None:
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1071
            return self._adjustlinkrev(toprev, inclusive=True, stoprev=stoprev)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1072
        elif '_descendantrev' in attrs:
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1073
            introrev = self._adjustlinkrev(self._descendantrev, stoprev=stoprev)
40732
aee94f0a36cd context: take advantage of `_descendantrev` in introrev if available
Boris Feld <boris.feld@octobus.net>
parents: 40731
diff changeset
  1074
            # be nice and cache the result of the computation
40736
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1075
            if introrev is not None:
d98fb3f42f33 context: floor adjustlinkrev graph walk during copy tracing
Boris Feld <boris.feld@octobus.net>
parents: 40735
diff changeset
  1076
                self._changeid = introrev
40732
aee94f0a36cd context: take advantage of `_descendantrev` in introrev if available
Boris Feld <boris.feld@octobus.net>
parents: 40731
diff changeset
  1077
            return introrev
40047
50700a025953 context: reverse conditional branch order in introrev
Boris Feld <boris.feld@octobus.net>
parents: 40046
diff changeset
  1078
        else:
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1079
            return self.linkrev()
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
  1080
35280
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1081
    def introfilectx(self):
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1082
        """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: 35130
diff changeset
  1083
        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: 35130
diff changeset
  1084
        introrev = self.introrev()
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1085
        if self.rev() == introrev:
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1086
            return self
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1087
        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: 35130
diff changeset
  1088
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1089
    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
  1090
        """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
  1091
        fctx = filectx(self._repo, path, fileid=fileid, filelog=filelog)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1092
        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
  1093
            # 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
  1094
            # 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
  1095
            # 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
  1096
            # 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
  1097
            fctx._descendantrev = self.rev()
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1098
            fctx._ancestrycontext = getattr(self, '_ancestrycontext', None)
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1099
        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
  1100
            # 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
  1101
            fctx._descendantrev = self._descendantrev
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1102
            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
  1103
        return fctx
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1104
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1105
    def parents(self):
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 22192
diff changeset
  1106
        _path = self._path
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1107
        fl = self._filelog
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1108
        parents = self._filelog.parents(self._filenode)
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1109
        pl = [(_path, node, fl) for node in parents if node != nullid]
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1110
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
  1111
        r = fl.renamed(self._filenode)
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
  1112
        if r:
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1113
            # - 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
  1114
            # - 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
  1115
            # 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
  1116
            # the first one.
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
  1117
            #
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24050
diff changeset
  1118
            # 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
  1119
            # 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
  1120
            # 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
  1121
            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
  1122
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
  1123
        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
  1124
19606
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
  1125
    def p1(self):
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
  1126
        return self.parents()[0]
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
  1127
19607
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1128
    def p2(self):
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1129
        p = self.parents()
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1130
        if len(p) == 2:
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1131
            return p[1]
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
  1132
        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
  1133
37068
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36924
diff changeset
  1134
    def annotate(self, follow=False, skiprevs=None, diffopts=None):
37069
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37068
diff changeset
  1135
        """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: 37068
diff changeset
  1136
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37068
diff changeset
  1137
        - 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: 37068
diff changeset
  1138
        - line.lineno is the line number at the first appearance in the managed
37068
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36924
diff changeset
  1139
          file
37069
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37068
diff changeset
  1140
        - line.text is the data on that line (including newline character)
37068
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36924
diff changeset
  1141
        """
9097
431462bd8478 fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
  1142
        getlog = util.lrucachefunc(lambda x: self._repo.file(x))
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1143
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1144
        def parents(f):
24862
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1145
            # 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
  1146
            # 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
  1147
            # 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
  1148
            # 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
  1149
            f._changeid
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1150
            pl = f.parents()
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1151
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1152
            # 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
  1153
            if not follow:
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1154
                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
  1155
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1156
            # 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
  1157
            # from the cache to save time
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1158
            for p in pl:
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1159
                if not '_filelog' in p.__dict__:
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1160
                    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
  1161
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1162
            return pl
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1163
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1164
        # use linkrev to find the first changeset where self appeared
35280
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1165
        base = self.introfilectx()
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1166
        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
  1167
            # 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
  1168
            # 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
  1169
            cl = self._repo.unfiltered().changelog
35280
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1170
            if base.rev() is None:
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1171
                # wctx is not inclusive, but works because _ancestrycontext
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1172
                # is used to test filelog revisions
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1173
                ac = cl.ancestors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1174
                    [p.rev() for p in base.parents()], inclusive=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1175
                )
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1176
            else:
35280
d90c534099b1 filectx: extract helper method to obtain filectx pointing to its introrev
Yuya Nishihara <yuya@tcha.org>
parents: 35130
diff changeset
  1177
                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
  1178
            base._ancestrycontext = ac
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1179
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1180
        return dagop.annotate(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1181
            base, parents, skiprevs=skiprevs, diffopts=diffopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1182
        )
3124
4d021b91cb26 filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents: 3123
diff changeset
  1183
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1184
    def ancestors(self, followfirst=False):
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1185
        visit = {}
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1186
        c = self
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1187
        if followfirst:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1188
            cut = 1
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1189
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1190
            cut = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1191
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1192
        while True:
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1193
            for parent in c.parents()[:cut]:
23981
24b57c3899f8 filectx: use linkrev to sort ancestors
Matt Mackall <mpm@selenic.com>
parents: 23980
diff changeset
  1194
                visit[(parent.linkrev(), parent.filenode())] = parent
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1195
            if not visit:
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1196
                break
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1197
            c = visit.pop(max(visit))
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1198
            yield c
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1199
33919
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1200
    def decodeddata(self):
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1201
        """Returns `data()` after running repository decoding filters.
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1202
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1203
        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: 33818
diff changeset
  1204
        """
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1205
        return self._repo.wwritedata(self.path(), self.data())
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1206
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1207
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1208
class filectx(basefilectx):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1209
    """A filecontext object makes access to data related to a particular
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1210
       filerevision convenient."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1211
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1212
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1213
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1214
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1215
        path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1216
        changeid=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1217
        fileid=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1218
        filelog=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1219
        changectx=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1220
    ):
40063
b6c2543e1dd8 filectx: correct docstring about "changeid"
Martin von Zweigbergk <martinvonz@google.com>
parents: 40062
diff changeset
  1221
        """changeid must be a revision number, if specified.
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1222
           fileid can be a file revision or node."""
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1223
        self._repo = repo
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1224
        self._path = path
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1225
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1226
        assert (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1227
            changeid is not None or fileid is not None or changectx is not None
43346
6ada8a274b9c formatting: run black version 19.10b0 on the codebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
  1228
        ), (
6ada8a274b9c formatting: run black version 19.10b0 on the codebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
  1229
            b"bad args: changeid=%r, fileid=%r, changectx=%r"
6ada8a274b9c formatting: run black version 19.10b0 on the codebase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
  1230
            % (changeid, fileid, changectx,)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1231
        )
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1232
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1233
        if filelog is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1234
            self._filelog = filelog
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1235
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1236
        if changeid is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1237
            self._changeid = changeid
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1238
        if changectx is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1239
            self._changectx = changectx
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1240
        if fileid is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1241
            self._fileid = fileid
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1242
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1243
    @propertycache
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1244
    def _changectx(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1245
        try:
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
  1246
            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
  1247
        except error.FilteredRepoLookupError:
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1248
            # 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
  1249
            # 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
  1250
            # `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
  1251
            # 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
  1252
            # 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
  1253
            # `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
  1254
            # filtering.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1255
            #
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1256
            # 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
  1257
            # 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
  1258
            # 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
  1259
            # behavior" is seen as better as "crash"
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1260
            #
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1261
            # 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
  1262
            # 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
  1263
            # considered when solving linkrev issue are on the table.
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
  1264
            return self._repo.unfiltered()[self._changeid]
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1265
23770
50f0096a7346 filectx: fix annotate to not directly instantiate filectx
Durham Goode <durham@fb.com>
parents: 23757
diff changeset
  1266
    def filectx(self, fileid, changeid=None):
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1267
        '''opens an arbitrary revision of the file without
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1268
        opening a new filelog'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1269
        return filectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1270
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1271
            self._path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1272
            fileid=fileid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1273
            filelog=self._filelog,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1274
            changeid=changeid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1275
        )
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1276
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30718
diff changeset
  1277
    def rawdata(self):
42785
e75981b7ce84 rawdata: update callers in context
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42731
diff changeset
  1278
        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
  1279
32281
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1280
    def rawflags(self):
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1281
        """low-level revlog flags"""
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1282
        return self._filelog.flags(self._filerev)
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1283
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1284
    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
  1285
        try:
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1286
            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
  1287
        except error.CensoredNodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1288
            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
  1289
                return b""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1290
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1291
                _(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
  1292
                hint=_(b"set censor.policy to ignore errors"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1293
            )
22932
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1294
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1295
    def size(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1296
        return self._filelog.size(self._filerev)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1297
32279
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
  1298
    @propertycache
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
  1299
    def _copied(self):
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1300
        """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
  1301
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1302
        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
  1303
        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
  1304
        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
  1305
        """
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1306
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1307
        renamed = self._filelog.renamed(self._filenode)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1308
        if not renamed:
39726
7375a9ab0149 filectx: fix return of renamed
Sean Farley <sean@farley.io>
parents: 39592
diff changeset
  1309
            return None
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1310
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1311
        if self.rev() == self.linkrev():
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1312
            return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1313
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1314
        name = self.path()
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1315
        fnode = self._filenode
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1316
        for p in self._changectx.parents():
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1317
            try:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1318
                if fnode == p.filenode(name):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1319
                    return None
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1320
            except error.LookupError:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1321
                pass
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1322
        return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1323
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1324
    def children(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1325
        # hard for renames
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1326
        c = self._filelog.children(self._filenode)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1327
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1328
            filectx(self._repo, self._path, fileid=x, filelog=self._filelog)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1329
            for x in c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1330
        ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1331
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1332
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1333
class committablectx(basectx):
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1334
    """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
  1335
    wants the ability to commit, e.g. workingctx or memctx."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1336
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1337
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1338
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1339
        repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1340
        text=b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1341
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1342
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1343
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1344
        changes=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1345
        branch=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1346
    ):
37177
fbe34945220d context: set repo property in basectx
Martin von Zweigbergk <martinvonz@google.com>
parents: 37176
diff changeset
  1347
        super(committablectx, self).__init__(repo)
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1348
        self._rev = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1349
        self._node = None
6709
f84f507c53d3 context: let workingctx.date(), .user() and description() be overriden
Patrick Mezard <pmezard@gmail.com>
parents: 6708
diff changeset
  1350
        self._text = text
6718
4386a7706828 Fix commit date (issue1193)
Christian Ebert <blacktrash@gmx.net>
parents: 6715
diff changeset
  1351
        if date:
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36441
diff changeset
  1352
            self._date = dateutil.parsedate(date)
6817
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6809
diff changeset
  1353
        if user:
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6809
diff changeset
  1354
            self._user = user
6707
02bad34230a2 localrepo: hide commit() file selection behind workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
  1355
        if changes:
21592
16f62b4203b1 committablectx: simplify caching the status
Sean Farley <sean.michael.farley@gmail.com>
parents: 21590
diff changeset
  1356
            self._status = changes
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1357
6708
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1358
        self._extra = {}
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1359
        if extra:
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1360
            self._extra = extra.copy()
42323
df2f22befdc8 context: let caller pass in branch to committablectx.__init__()
Martin von Zweigbergk <martinvonz@google.com>
parents: 42322
diff changeset
  1361
        if branch is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1362
            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
  1363
        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
  1364
            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
  1365
32666
1df98fc923d4 py3: implement __bytes__ for committablectx
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32636
diff changeset
  1366
    def __bytes__(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1367
        return bytes(self._parents[0]) + b"+"
19666
09459edfb48b commitablectx: move __str__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19665
diff changeset
  1368
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
  1369
    __str__ = encoding.strmethod(__bytes__)
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
  1370
19667
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1371
    def __nonzero__(self):
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1372
        return True
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1373
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  1374
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  1375
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1376
    @propertycache
19672
375986c02539 commitablectx: move _status from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19671
diff changeset
  1377
    def _status(self):
21592
16f62b4203b1 committablectx: simplify caching the status
Sean Farley <sean.michael.farley@gmail.com>
parents: 21590
diff changeset
  1378
        return self._repo.status()
19672
375986c02539 commitablectx: move _status from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19671
diff changeset
  1379
19674
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1380
    @propertycache
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1381
    def _user(self):
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1382
        return self._repo.ui.username()
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1383
19676
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1384
    @propertycache
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1385
    def _date(self):
32447
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1386
        ui = self._repo.ui
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1387
        date = ui.configdate(b'devel', b'default-date')
32447
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1388
        if date is None:
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36441
diff changeset
  1389
            date = dateutil.makedate()
32447
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1390
        return date
19676
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1391
21587
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1392
    def subrev(self, subpath):
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1393
        return None
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1394
24719
11e8fec00234 committablectx: override manifestnode() to return None
Yuya Nishihara <yuya@tcha.org>
parents: 24646
diff changeset
  1395
    def manifestnode(self):
11e8fec00234 committablectx: override manifestnode() to return None
Yuya Nishihara <yuya@tcha.org>
parents: 24646
diff changeset
  1396
        return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1397
19675
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1398
    def user(self):
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1399
        return self._user or self._repo.ui.username()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1400
19677
e11415510352 commitablectx: move date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19676
diff changeset
  1401
    def date(self):
e11415510352 commitablectx: move date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19676
diff changeset
  1402
        return self._date
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1403
19678
897c2dbc0256 commitablectx: move description from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19677
diff changeset
  1404
    def description(self):
897c2dbc0256 commitablectx: move description from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19677
diff changeset
  1405
        return self._text
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1406
19679
f21804f1582e commitablectx: move files from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19678
diff changeset
  1407
    def files(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1408
        return sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1409
            self._status.modified + self._status.added + self._status.removed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1410
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1411
41798
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1412
    def modified(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1413
        return self._status.modified
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1414
41798
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1415
    def added(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1416
        return self._status.added
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1417
41798
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1418
    def removed(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1419
        return self._status.removed
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1420
41798
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1421
    def deleted(self):
2ba96fca8528 committablectx: move status-related methods closer together
Martin von Zweigbergk <martinvonz@google.com>
parents: 41785
diff changeset
  1422
        return self._status.deleted
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1423
42396
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
  1424
    filesmodified = modified
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
  1425
    filesadded = added
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
  1426
    filesremoved = removed
65fa61ca20af context: add ctx.files{modified,added,removed}() methods
Martin von Zweigbergk <martinvonz@google.com>
parents: 42345
diff changeset
  1427
19687
54b3b4821bfb commitablectx: move branch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19686
diff changeset
  1428
    def branch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1429
        return encoding.tolocal(self._extra[b'branch'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1430
19688
21e1068109a7 commitablectx: move closesbranch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19687
diff changeset
  1431
    def closesbranch(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1432
        return b'close' in self._extra
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1433
19689
8dbb66f339f3 commitablectx: move extra from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19688
diff changeset
  1434
    def extra(self):
8dbb66f339f3 commitablectx: move extra from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19688
diff changeset
  1435
        return self._extra
19680
fc33fcfa08f2 commitablectx: move modified from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19679
diff changeset
  1436
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1437
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1438
        return False
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1439
19690
65ff9fd67d8d commitablectx: move tags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19689
diff changeset
  1440
    def tags(self):
25688
24cda1dd45ff workingctx: don't report the tags for its parents
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1441
        return []
19690
65ff9fd67d8d commitablectx: move tags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19689
diff changeset
  1442
19691
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1443
    def bookmarks(self):
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1444
        b = []
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1445
        for p in self.parents():
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1446
            b.extend(p.bookmarks())
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1447
        return b
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1448
19692
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1449
    def phase(self):
43968
bbcf78c4ff90 commitablectx: fix the default phase
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43807
diff changeset
  1450
        phase = phases.newcommitphase(self._repo.ui)
19692
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1451
        for p in self.parents():
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1452
            phase = max(phase, p.phase())
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1453
        return phase
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1454
19693
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1455
    def hidden(self):
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1456
        return False
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1457
19694
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1458
    def children(self):
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1459
        return []
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1460
19696
210cc42a8ac2 commitablectx: move ancestor from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19695
diff changeset
  1461
    def ancestor(self, c2):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
  1462
        """return the "best" ancestor context of self and c2"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1463
        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
  1464
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1465
    def ancestors(self):
23616
11a160547d7f context: return dirstate parents in workingctx.ancestors()
Durham Goode <durham@fb.com>
parents: 23603
diff changeset
  1466
        for p in self._parents:
11a160547d7f context: return dirstate parents in workingctx.ancestors()
Durham Goode <durham@fb.com>
parents: 23603
diff changeset
  1467
            yield p
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1468
        for a in self._repo.changelog.ancestors(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1469
            [p.rev() for p in self._parents]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1470
        ):
39958
e1e3d1b498d3 context: reduce dependence of changectx constructor
Martin von Zweigbergk <martinvonz@google.com>
parents: 39912
diff changeset
  1471
            yield self._repo[a]
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1472
19699
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1473
    def markcommitted(self, node):
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1474
        """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
  1475
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1476
        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
  1477
        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
  1478
        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
  1479
        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
  1480
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1481
        """
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1482
32633
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32632
diff changeset
  1483
    def dirty(self, missing=False, merge=True, branch=True):
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32632
diff changeset
  1484
        return False
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32632
diff changeset
  1485
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1486
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1487
class workingctx(committablectx):
19671
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1488
    """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
  1489
    the current working directory convenient.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1490
    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
  1491
    user - username string, or None.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1492
    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
  1493
    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
  1494
               or None to use the repository status.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1495
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1496
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1497
    def __init__(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1498
        self, repo, text=b"", user=None, date=None, extra=None, changes=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1499
    ):
42324
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42323
diff changeset
  1500
        branch = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1501
        if not extra or b'branch' not in extra:
42324
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42323
diff changeset
  1502
            try:
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42323
diff changeset
  1503
                branch = repo.dirstate.branch()
62bb49a1d05d context: default to using branch from dirstate only in workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42323
diff changeset
  1504
            except UnicodeDecodeError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1505
                raise error.Abort(_(b'branch name not in UTF-8!'))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1506
        super(workingctx, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1507
            repo, text, user, date, extra, changes, branch=branch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1508
        )
19671
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1509
14129
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1510
    def __iter__(self):
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1511
        d = self._repo.dirstate
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1512
        for f in d:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1513
            if d[f] != b'r':
14129
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1514
                yield f
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1515
21845
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1516
    def __contains__(self, key):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1517
        return self._repo.dirstate[key] not in b"?r"
21845
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1518
25590
183965a00c76 context: override workingctx.hex() to avoid a crash
Matt Harbison <matt_harbison@yahoo.com>
parents: 25465
diff changeset
  1519
    def hex(self):
41972
21cc92fea2aa context: use wdirhex constant instead of calculating it
Martin von Zweigbergk <martinvonz@google.com>
parents: 41954
diff changeset
  1520
        return wdirhex
25590
183965a00c76 context: override workingctx.hex() to avoid a crash
Matt Harbison <matt_harbison@yahoo.com>
parents: 25465
diff changeset
  1521
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1522
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1523
    def _parents(self):
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1524
        p = self._repo.dirstate.parents()
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1525
        if p[1] == nullid:
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1526
            p = p[:-1]
39960
43d3b09b3e5a repo: move unfiltered-repo optimization to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 39959
diff changeset
  1527
        # use unfiltered repo to delay/avoid loading obsmarkers
43d3b09b3e5a repo: move unfiltered-repo optimization to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 39959
diff changeset
  1528
        unfi = self._repo.unfiltered()
43787
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43784
diff changeset
  1529
        return [
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43784
diff changeset
  1530
            changectx(
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43784
diff changeset
  1531
                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: 43784
diff changeset
  1532
            )
f3b23d5c15fd changectx: mark the parents of the working copy as non filtered
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43784
diff changeset
  1533
            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: 43784
diff changeset
  1534
        ]
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1535
44052
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1536
    def setparents(self, p1node, p2node=nullid):
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1537
        dirstate = self._repo.dirstate
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1538
        with dirstate.parentchange():
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1539
            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
  1540
            pctx = self._repo[p1node]
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1541
            if copies:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1542
                # 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
  1543
                # 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
  1544
                # 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
  1545
                for f in copies:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1546
                    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
  1547
                        dirstate.copy(copies[f], f)
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1548
            if p2node == nullid:
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1549
                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
  1550
                    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
  1551
                        dirstate.copy(None, f)
b74270da5eee workingctx: move setparents() logic from localrepo to mirror overlayworkingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 44051
diff changeset
  1552
37447
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1553
    def _fileinfo(self, path):
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1554
        # 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
  1555
        self._manifest
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1556
        return super(workingctx, self)._fileinfo(path)
067e8d1178a2 workingctx: build _manifest on filenode() or flags() request
Yuya Nishihara <yuya@tcha.org>
parents: 37391
diff changeset
  1557
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1558
    def _buildflagfunc(self):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1559
        # 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: 42318
diff changeset
  1560
        # filesystem doesn't support them
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1561
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1562
        copiesget = self._repo.dirstate.copies().get
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1563
        parents = self.parents()
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1564
        if len(parents) < 2:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1565
            # 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: 42318
diff changeset
  1566
            man = parents[0].manifest()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1567
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1568
            def func(f):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1569
                f = copiesget(f, f)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1570
                return man.flags(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1571
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1572
        else:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1573
            # 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: 42318
diff changeset
  1574
            # result from the merge (issue1802)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1575
            p1, p2 = parents
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1576
            pa = p1.ancestor(p2)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1577
            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: 42318
diff changeset
  1578
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1579
            def func(f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1580
                f = copiesget(f, f)  # may be wrong for merges with copies
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1581
                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: 42318
diff changeset
  1582
                if fl1 == fl2:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1583
                    return fl1
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1584
                if fl1 == fla:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1585
                    return fl2
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1586
                if fl2 == fla:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1587
                    return fl1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1588
                return b''  # punt for conflicts
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1589
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1590
        return func
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1591
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1592
    @propertycache
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1593
    def _flagfunc(self):
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1594
        return self._repo.dirstate.flagfunc(self._buildflagfunc)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1595
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1596
    def flags(self, path):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43551
diff changeset
  1597
        if '_manifest' in self.__dict__:
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1598
            try:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1599
                return self._manifest.flags(path)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1600
            except KeyError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1601
                return b''
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1602
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1603
        try:
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1604
            return self._flagfunc(path)
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1605
        except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1606
            return b''
42319
491855ea9d62 context: move flags overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42318
diff changeset
  1607
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
  1608
    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
  1609
        """get a file context from the working directory"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1610
        return workingfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1611
            self._repo, path, workingctx=self, filelog=filelog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1612
        )
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1613
16491
bfe89d65d651 update: make --check abort with dirty subrepos
Patrick Mezard <patrick@mezard.eu>
parents: 16410
diff changeset
  1614
    def dirty(self, missing=False, merge=True, branch=True):
43807
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43787
diff changeset
  1615
        """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
  1616
        # check subrepos first
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18252
diff changeset
  1617
        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
  1618
            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
  1619
                return True
22f5ad0b5857 subrepo: dirtiness checks should iterate over subrepos
Edouard Gomez <ed.gomez@free.fr>
parents: 11106
diff changeset
  1620
        # check current working dir
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1621
        return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1622
            (merge and self.p2())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1623
            or (branch and self.branch() != self.p1().branch())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1624
            or self.modified()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1625
            or self.added()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1626
            or self.removed()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1627
            or (missing and self.deleted())
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1628
        )
8717
e8de59577257 context: add a dirty method to detect modified contexts
Matt Mackall <mpm@selenic.com>
parents: 8528
diff changeset
  1629
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1630
    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
  1631
        with self._repo.wlock():
37a75d69eb43 with: use context manager for wlock in workingctx.add
Bryan O'Sullivan <bryano@fb.com>
parents: 27749
diff changeset
  1632
            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
  1633
            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
  1634
            rejected = []
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1635
            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
  1636
            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
  1637
                # 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
  1638
                # 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
  1639
                # 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
  1640
                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
  1641
                try:
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1642
                    st = lstat(f)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13962
diff changeset
  1643
                except OSError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1644
                    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
  1645
                    rejected.append(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1646
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1647
                limit = ui.configbytes(b'ui', b'large-file-limit')
38601
a936d1368fc5 ui: make the large file warning limit fully configurable
Joerg Sonnenberger <joerg@bec.de>
parents: 38590
diff changeset
  1648
                if limit != 0 and st.st_size > limit:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1649
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1650
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1651
                            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
  1652
                            b"to manage this file\n"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1653
                            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
  1654
                            b"pending addition)\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1655
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1656
                        % (f, 3 * st.st_size // 1000000, uipath(f))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1657
                    )
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1658
                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: 43025
diff changeset
  1659
                    ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1660
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1661
                            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
  1662
                            b"supported currently\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1663
                        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1664
                        % uipath(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1665
                    )
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1666
                    rejected.append(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1667
                elif ds[f] in b'amn':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1668
                    ui.warn(_(b"%s already tracked!\n") % uipath(f))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1669
                elif ds[f] == b'r':
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1670
                    ds.normallookup(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1671
                else:
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1672
                    ds.add(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1673
            return rejected
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1674
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1675
    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
  1676
        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
  1677
            ds = self._repo.dirstate
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1678
            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
  1679
            rejected = []
14435
5f6090e559fa context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents: 14434
diff changeset
  1680
            for f in files:
41625
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1681
                if f not in ds:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1682
                    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
  1683
                    rejected.append(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1684
                elif ds[f] != b'a':
41625
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1685
                    ds.remove(f)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1686
                else:
41625
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1687
                    ds.drop(f)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15895
diff changeset
  1688
            return rejected
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1689
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1690
    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
  1691
        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
  1692
            st = self._repo.wvfs.lstat(dest)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25600
diff changeset
  1693
        except OSError as err:
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
  1694
            if err.errno != errno.ENOENT:
12a8bdd97b4f context: use "vfs.lstat()" to examine target path instead of "os.path.*"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19901
diff changeset
  1695
                raise
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1696
            self._repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1697
                _(b"%s does not exist!\n") % self._repo.dirstate.pathto(dest)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1698
            )
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
  1699
            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
  1700
        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: 43025
diff changeset
  1701
            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
  1702
                _(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: 43025
diff changeset
  1703
                % self._repo.dirstate.pathto(dest)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1704
            )
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1705
        else:
27812
28d0c0ef327b with: use context manager for wlock in copy
Bryan O'Sullivan <bryano@fb.com>
parents: 27811
diff changeset
  1706
            with self._repo.wlock():
41625
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1707
                ds = self._repo.dirstate
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1708
                if ds[dest] in b'?':
41625
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1709
                    ds.add(dest)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1710
                elif ds[dest] in b'r':
41625
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1711
                    ds.normallookup(dest)
fbd4ce55bcbd context: replace repeated "self._repo.dirstate" by "ds" variable
Martin von Zweigbergk <martinvonz@google.com>
parents: 41624
diff changeset
  1712
                ds.copy(source, dest)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1713
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1714
    def match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1715
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1716
        pats=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1717
        include=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1718
        exclude=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1719
        default=b'glob',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1720
        listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1721
        badfn=None,
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
  1722
        cwd=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1723
    ):
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1724
        r = self._repo
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
  1725
        if not cwd:
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
  1726
            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
  1727
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1728
        # 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
  1729
        # to actual case in the filesystem.
32439
284b18303f61 match: replace icasefsmatch() function by flag to regular match()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32433
diff changeset
  1730
        icasefs = not util.fscasesensitive(r.root)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1731
        return matchmod.match(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1732
            r.root,
44012
e685fac56693 match: resolve filesets against the passed `cwd`, not the current one
Matt Harbison <matt_harbison@yahoo.com>
parents: 43968
diff changeset
  1733
            cwd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1734
            pats,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1735
            include,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1736
            exclude,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1737
            default,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1738
            auditor=r.auditor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1739
            ctx=self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1740
            listsubrepos=listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1741
            badfn=badfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1742
            icasefs=icasefs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1743
        )
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1744
21393
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1745
    def _filtersuspectsymlink(self, files):
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1746
        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
  1747
            return files
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1748
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1749
        # 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
  1750
        # 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
  1751
        # 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
  1752
        # symlink
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1753
        sane = []
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1754
        for f in files:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1755
            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
  1756
                d = self[f].data()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1757
                if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1758
                    d == b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1759
                    or len(d) >= 1024
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1760
                    or b'\n' in d
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1761
                    or stringutil.binary(d)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1762
                ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1763
                    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
  1764
                        b'ignoring suspect symlink placeholder "%s"\n' % f
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1765
                    )
21393
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1766
                    continue
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1767
            sane.append(f)
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1768
        return sane
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1769
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1770
    def _checklookup(self, files):
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1771
        # 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
  1772
        if not files:
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1773
            return [], [], []
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1774
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1775
        modified = []
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1776
        deleted = []
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1777
        fixup = []
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1778
        pctx = self._parents[0]
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1779
        # 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
  1780
        for f in sorted(files):
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1781
            try:
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1782
                # 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
  1783
                # directory in the interim, but fixing that is pretty hard.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1784
                if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1785
                    f not in pctx
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1786
                    or self.flags(f) != pctx.flags(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1787
                    or pctx[f].cmp(self[f])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1788
                ):
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1789
                    modified.append(f)
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1790
                else:
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1791
                    fixup.append(f)
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1792
            except (IOError, OSError):
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1793
                # 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
  1794
                # matching dirstate behavior (issue5584).
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1795
                # 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
  1796
                # 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
  1797
                # 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
  1798
                # it's in the dirstate.
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1799
                deleted.append(f)
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1800
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1801
        return modified, deleted, fixup
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1802
32832
6d73b7ff8f92 workingctx: also pass status tuple into poststatusfixup
Siddharth Agarwal <sid0@fb.com>
parents: 32831
diff changeset
  1803
    def _poststatusfixup(self, status, fixup):
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1804
        """update dirstate for files that are actually clean"""
32833
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1805
        poststatus = self._repo.postdsstatus()
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1806
        if fixup or poststatus:
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1807
            try:
32772
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1808
                oldid = self._repo.dirstate.identity()
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1809
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1810
                # 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
  1811
                # 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
  1812
                # 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
  1813
                # taking the lock
27813
ff20fe74e5c6 with: use context manager for wlock in checklookup
Bryan O'Sullivan <bryano@fb.com>
parents: 27812
diff changeset
  1814
                with self._repo.wlock(False):
32772
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1815
                    if self._repo.dirstate.identity() == oldid:
32833
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1816
                        if fixup:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1817
                            normal = self._repo.dirstate.normal
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1818
                            for f in fixup:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1819
                                normal(f)
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1820
                            # write changes out explicitly, because nesting
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1821
                            # wlock at runtime may prevent 'wlock.release()'
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1822
                            # after this block from doing so for subsequent
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1823
                            # changing files
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1824
                            tr = self._repo.currenttransaction()
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1825
                            self._repo.dirstate.write(tr)
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1826
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1827
                        if poststatus:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1828
                            for ps in poststatus:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1829
                                ps(self, status)
32772
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1830
                    else:
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1831
                        # in this case, writing changes out breaks
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1832
                        # consistency, because .hg/dirstate was
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1833
                        # already changed simultaneously after last
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1834
                        # caching (see also issue5584 for detail)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1835
                        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
  1836
                            b'skip updating dirstate: identity mismatch\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1837
                        )
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1838
            except error.LockError:
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1839
                pass
32833
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1840
            finally:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1841
                # 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: 32832
diff changeset
  1842
                self._repo.clearpostdsstatus()
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1843
33955
e43264525ce5 context: remove unnecessary default values for matchers (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33954
diff changeset
  1844
    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
  1845
        '''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
  1846
        subrepos = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1847
        if b'.hgsub' in self:
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1848
            subrepos = sorted(self.substate)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1849
        cmp, s = self._repo.dirstate.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1850
            match, subrepos, ignored=ignored, clean=clean, unknown=unknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1851
        )
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1852
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1853
        # check for any possibly clean files
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1854
        fixup = []
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1855
        if cmp:
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1856
            modified2, deleted2, fixup = self._checklookup(cmp)
23303
3f269bd4826c context.status: avoid de- and reconstructing status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23302
diff changeset
  1857
            s.modified.extend(modified2)
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1858
            s.deleted.extend(deleted2)
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1859
34351
ac0cd81e2f83 dirstate: use keyword arguments to clarify status()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34350
diff changeset
  1860
            if fixup and clean:
23303
3f269bd4826c context.status: avoid de- and reconstructing status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23302
diff changeset
  1861
                s.clean.extend(fixup)
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1862
32832
6d73b7ff8f92 workingctx: also pass status tuple into poststatusfixup
Siddharth Agarwal <sid0@fb.com>
parents: 32831
diff changeset
  1863
        self._poststatusfixup(s, fixup)
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1864
23776
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1865
        if match.always():
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1866
            # cache for performance
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1867
            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
  1868
                # "_status" is cached with list*=False in the normal route
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1869
                self._status = scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1870
                    s.modified, s.added, s.removed, s.deleted, [], [], []
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1871
                )
23776
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1872
            else:
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1873
                self._status = s
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1874
23303
3f269bd4826c context.status: avoid de- and reconstructing status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23302
diff changeset
  1875
        return s
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1876
31269
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1877
    @propertycache
42318
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1878
    def _copies(self):
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1879
        p1copies = {}
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1880
        p2copies = {}
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1881
        parents = self._repo.dirstate.parents()
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1882
        p1manifest = self._repo[parents[0]].manifest()
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1883
        p2manifest = self._repo[parents[1]].manifest()
42865
2b869a515ba6 context: filter out invalid copies from workingctx.p[12]copies()
Martin von Zweigbergk <martinvonz@google.com>
parents: 42785
diff changeset
  1884
        changedset = set(self.added()) | set(self.modified())
42318
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1885
        narrowmatch = self._repo.narrowmatch()
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1886
        for dst, src in self._repo.dirstate.copies().items():
42865
2b869a515ba6 context: filter out invalid copies from workingctx.p[12]copies()
Martin von Zweigbergk <martinvonz@google.com>
parents: 42785
diff changeset
  1887
            if dst not in changedset or not narrowmatch(dst):
42318
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1888
                continue
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1889
            if src in p1manifest:
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1890
                p1copies[dst] = src
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1891
            elif src in p2manifest:
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1892
                p2copies[dst] = src
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1893
        return p1copies, p2copies
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1894
a13b30555ffb context: reuse changectx._copies() in all but workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42317
diff changeset
  1895
    @propertycache
31269
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1896
    def _manifest(self):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1897
        """generate a manifest corresponding to the values in self._status
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1898
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1899
        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: 31268
diff changeset
  1900
        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: 31268
diff changeset
  1901
        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: 31268
diff changeset
  1902
        deleting newly added files.
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1903
        """
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1904
        return self._buildstatusmanifest(self._status)
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1905
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1906
    def _buildstatusmanifest(self, status):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1907
        """Builds a manifest that includes the given status results."""
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1908
        parents = self.parents()
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1909
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1910
        man = parents[0].manifest().copy()
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1911
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1912
        ff = self._flagfunc
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1913
        for i, l in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1914
            (addednodeid, status.added),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1915
            (modifiednodeid, status.modified),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1916
        ):
31269
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1917
            for f in l:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1918
                man[f] = i
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1919
                try:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1920
                    man.setflag(f, ff(f))
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1921
                except OSError:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1922
                    pass
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1923
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1924
        for f in status.deleted + status.removed:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1925
            if f in man:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1926
                del man[f]
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1927
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1928
        return man
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1929
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1930
    def _buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1931
        self, other, s, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1932
    ):
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1933
        """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
  1934
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1935
        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
  1936
        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
  1937
        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
  1938
        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
  1939
        """
23239
9fbb50444d55 context.status: call _dirstatestatus() from within _buildstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23238
diff changeset
  1940
        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
  1941
        # 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
  1942
        # 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
  1943
        # 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
  1944
        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
  1945
        if other != self._repo[b'.']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1946
            s = super(workingctx, self)._buildstatus(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1947
                other, s, match, listignored, listclean, listunknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1948
            )
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1949
        return s
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1950
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
  1951
    def _matchstatus(self, other, match):
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1952
        """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
  1953
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1954
        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
  1955
        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
  1956
        comparing against the parent changeset.
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1957
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1958
        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
  1959
        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
  1960
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1961
        if other != self._repo[b'.']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1962
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1963
            def bad(f, msg):
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1964
                # '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
  1965
                # 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
  1966
                if f not in other and not other.hasdir(f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1967
                    self._repo.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1968
                        b'%s: %s\n' % (self._repo.dirstate.pathto(f), msg)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1969
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1970
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1971
            match.bad = bad
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1972
        return match
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1973
42320
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1974
    def walk(self, match):
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1975
        '''Generates matching file names.'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1976
        return sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1977
            self._repo.dirstate.walk(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1978
                self._repo.narrowmatch(match),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1979
                subrepos=sorted(self.substate),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1980
                unknown=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1981
                ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1982
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  1983
        )
42320
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1984
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1985
    def matches(self, match):
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1986
        match = self._repo.narrowmatch(match)
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1987
        ds = self._repo.dirstate
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1988
        return sorted(f for f in ds.matches(match) if ds[f] != b'r')
42320
4fbfc893e6b9 context: move walk() and match() overrides from committablectx to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42319
diff changeset
  1989
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  1990
    def markcommitted(self, node):
42322
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1991
        with self._repo.dirstate.parentchange():
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1992
            for f in self.modified() + self.added():
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1993
                self._repo.dirstate.normal(f)
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1994
            for f in self.removed():
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1995
                self._repo.dirstate.drop(f)
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1996
            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
  1997
            self._repo._quick_access_changeid_invalidate()
42322
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1998
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  1999
        # write changes out explicitly, because nesting wlock at
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  2000
        # runtime may prevent 'wlock.release()' in 'repo.commit()'
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  2001
        # from immediately doing so for subsequent changing files
fdd4d668ceb5 context: move contents of committablectx.markcommitted() to workingctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42320
diff changeset
  2002
        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
  2003
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  2004
        sparse.aftercommit(self._repo, node)
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  2005
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2006
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2007
class committablefilectx(basefilectx):
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2008
    """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
  2009
    that wants the ability to commit, e.g. workingfilectx or memfilectx."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2010
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
  2011
    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
  2012
        self._repo = repo
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2013
        self._path = path
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2014
        self._changeid = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2015
        self._filerev = self._filenode = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2016
19149
921b64e1f7b9 filecontext: use 'is not None' to check for filelog existence
Durham Goode <durham@fb.com>
parents: 19061
diff changeset
  2017
        if filelog is not None:
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2018
            self._filelog = filelog
19702
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  2019
        if ctx:
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  2020
            self._changectx = ctx
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  2021
19703
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  2022
    def __nonzero__(self):
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  2023
        return True
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  2024
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  2025
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  2026
24420
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2027
    def linkrev(self):
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2028
        # 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
  2029
        return self.rev()
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  2030
41779
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41778
diff changeset
  2031
    def renamed(self):
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41778
diff changeset
  2032
        path = self.copysource()
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41778
diff changeset
  2033
        if not path:
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41778
diff changeset
  2034
            return None
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41778
diff changeset
  2035
        return path, self._changectx._parents[0]._manifest.get(path, nullid)
c7a843aa4b42 context: move equivalent renamed() implementations to superclass
Martin von Zweigbergk <martinvonz@google.com>
parents: 41778
diff changeset
  2036
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2037
    def parents(self):
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2038
        '''return parent filectxs, following copies if necessary'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2039
8528
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2040
        def filenode(ctx, path):
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2041
            return ctx._manifest.get(path, nullid)
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2042
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2043
        path = self._path
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2044
        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
  2045
        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
  2046
        renamed = self.renamed()
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2047
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2048
        if renamed:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2049
            pl = [renamed + (None,)]
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2050
        else:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2051
            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
  2052
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  2053
        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
  2054
            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
  2055
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2056
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2057
            self._parentfilectx(p, fileid=n, filelog=l)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2058
            for p, n, l in pl
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2059
            if n != nullid
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2060
        ]
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  2061
19705
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  2062
    def children(self):
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  2063
        return []
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  2064
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2065
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  2066
class workingfilectx(committablefilectx):
19704
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2067
    """A workingfilectx object makes access to data related to a particular
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2068
       file in the working directory convenient."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2069
19704
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2070
    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
  2071
        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
  2072
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2073
    @propertycache
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2074
    def _changectx(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2075
        return workingctx(self._repo)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2076
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2077
    def data(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  2078
        return self._repo.wread(self._path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2079
41777
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
  2080
    def copysource(self):
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
  2081
        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
  2082
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2083
    def size(self):
19901
4d3ce1646dfc context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
  2084
        return self._repo.wvfs.lstat(self._path).st_size
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2085
42472
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42426
diff changeset
  2086
    def lstat(self):
87a34c767384 merge: fix race that could cause wrong size in dirstate
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 42426
diff changeset
  2087
        return self._repo.wvfs.lstat(self._path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2088
3962
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2089
    def date(self):
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2090
        t, tz = self._changectx.date()
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2091
        try:
36789
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36744
diff changeset
  2092
            return (self._repo.wvfs.lstat(self._path)[stat.ST_MTIME], tz)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25600
diff changeset
  2093
        except OSError as err:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2094
            if err.errno != errno.ENOENT:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2095
                raise
3962
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  2096
            return (t, tz)
3310
0e370798eebf context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents: 3302
diff changeset
  2097
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  2098
    def exists(self):
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  2099
        return self._repo.wvfs.exists(self._path)
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  2100
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  2101
    def lexists(self):
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  2102
        return self._repo.wvfs.lexists(self._path)
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  2103
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  2104
    def audit(self):
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  2105
        return self._repo.wvfs.audit(self._path)
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  2106
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  2107
    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
  2108
        """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
  2109
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  2110
        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
  2111
        """
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
  2112
        # 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
  2113
        # 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
  2114
        return fctx.cmp(self)
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2115
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2116
    def remove(self, ignoremissing=False):
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2117
        """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
  2118
        rmdir = self._repo.ui.configbool(b'experimental', b'removeemptydirs')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2119
        self._repo.wvfs.unlinkpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2120
            self._path, ignoremissing=ignoremissing, rmdir=rmdir
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2121
        )
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2122
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2123
    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
  2124
        """wraps repo.wwrite"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2125
        return self._repo.wwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2126
            self._path, data, flags, backgroundclose=backgroundclose, **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2127
        )
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  2128
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  2129
    def markcopied(self, src):
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  2130
        """marks this file a copy of `src`"""
42345
313812cbf4ca copies: fix duplicatecopies() with overlay context
Martin von Zweigbergk <martinvonz@google.com>
parents: 42324
diff changeset
  2131
        self._repo.dirstate.copy(src, self._path)
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  2132
34054
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  2133
    def clearunknown(self):
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  2134
        """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: 34017
diff changeset
  2135
        ``write()`` can be called successfully.
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  2136
        """
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  2137
        wvfs = self._repo.wvfs
34556
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  2138
        f = self._path
34833
07bbb208a924 context: audit paths before clearing unknown files and dirs
Mark Thomas <mbthomas@fb.com>
parents: 34787
diff changeset
  2139
        wvfs.audit(f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2140
        if self._repo.ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2141
            b'experimental', b'merge.checkpathconflicts'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2142
        ):
38775
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2143
            # 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
  2144
            # warned and backed up
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2145
            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
  2146
                wvfs.rmtree(f, forcibly=True)
43677
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43554
diff changeset
  2147
            for p in reversed(list(pathutil.finddirs(f))):
37104
656ac240f392 context: skip path conflicts by default when clearing unknown file (issue5776)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37087
diff changeset
  2148
                if wvfs.isfileorlink(p):
656ac240f392 context: skip path conflicts by default when clearing unknown file (issue5776)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37087
diff changeset
  2149
                    wvfs.unlink(p)
656ac240f392 context: skip path conflicts by default when clearing unknown file (issue5776)
Matt Harbison <matt_harbison@yahoo.com>
parents: 37087
diff changeset
  2150
                    break
38775
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2151
        else:
8c6775e812d8 merge: do not delete untracked files silently (issue5962)
Yuya Nishihara <yuya@tcha.org>
parents: 38761
diff changeset
  2152
            # 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
  2153
            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
  2154
                wvfs.removedirs(f)
34054
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  2155
33096
873f638fd7db merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com>
parents: 33038
diff changeset
  2156
    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: 33038
diff changeset
  2157
        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: 33038
diff changeset
  2158
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2159
35332
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35331
diff changeset
  2160
class overlayworkingctx(committablectx):
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35331
diff changeset
  2161
    """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: 35331
diff changeset
  2162
    converted into a commit context.
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2163
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2164
    self._cache[path] maps to a dict with keys: {
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2165
        'exists': bool?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2166
        'date': date?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2167
        'data': str?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2168
        'flags': str?
35302
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2169
        'copied': str? (path or None)
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2170
    }
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2171
    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: 34068
diff changeset
  2172
    is `False`, the file was deleted.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2173
    """
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2174
35298
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35295
diff changeset
  2175
    def __init__(self, repo):
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2176
        super(overlayworkingctx, self).__init__(repo)
35295
307b1689e3f8 overlayworkingctx: make clean() public
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2177
        self.clean()
35298
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35295
diff changeset
  2178
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35295
diff changeset
  2179
    def setbase(self, wrappedctx):
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2180
        self._wrappedctx = wrappedctx
35298
2f8c476c49fe overlayworkingctx: move _wrappedctx out of the constructor
Phil Cohen <phillco@fb.com>
parents: 35295
diff changeset
  2181
        self._parents = [wrappedctx]
35336
777cb4497d8d overlayworkingctx: invalidate the manifest cache when changing parents
Phil Cohen <phillco@fb.com>
parents: 35335
diff changeset
  2182
        # 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: 35335
diff changeset
  2183
        # 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: 35335
diff changeset
  2184
        # ``overlayworkingctx`` (e.g. with --collapse).
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2185
        util.clearcachedproperty(self, b'_manifest')
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2186
44051
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2187
    def setparents(self, p1node, p2node=nullid):
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2188
        assert p1node == self._wrappedctx.node()
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2189
        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
  2190
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2191
    def data(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2192
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2193
            if self._cache[path][b'exists']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2194
                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
  2195
                    return self._cache[path][b'data']
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2196
                else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2197
                    # Must fallback here, too, because we only set flags.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2198
                    return self._wrappedctx[path].data()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2199
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2200
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2201
                    b"No such file or directory: %s" % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2202
                )
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2203
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2204
            return self._wrappedctx[path].data()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2205
35330
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2206
    @propertycache
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2207
    def _manifest(self):
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2208
        parents = self.parents()
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2209
        man = parents[0].manifest().copy()
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2210
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2211
        flag = self._flagfunc
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2212
        for path in self.added():
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2213
            man[path] = addednodeid
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2214
            man.setflag(path, flag(path))
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2215
        for path in self.modified():
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2216
            man[path] = modifiednodeid
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2217
            man.setflag(path, flag(path))
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2218
        for path in self.removed():
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2219
            del man[path]
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2220
        return man
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2221
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2222
    @propertycache
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2223
    def _flagfunc(self):
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2224
        def f(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2225
            return self._cache[path][b'flags']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2226
35330
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2227
        return f
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2228
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2229
    def files(self):
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2230
        return sorted(self.added() + self.modified() + self.removed())
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2231
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2232
    def modified(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2233
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2234
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2235
            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
  2236
            if self._cache[f][b'exists'] and self._existsinparent(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2237
        ]
35330
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2238
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2239
    def added(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2240
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2241
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2242
            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
  2243
            if self._cache[f][b'exists'] and not self._existsinparent(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2244
        ]
35330
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2245
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2246
    def removed(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2247
        return [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2248
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2249
            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
  2250
            if not self._cache[f][b'exists'] and self._existsinparent(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2251
        ]
35330
2e1c32a9c97b overlayworkingctx: add _manifest, files(), added(), removed(), modified()
Phil Cohen <phillco@fb.com>
parents: 35328
diff changeset
  2252
41764
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2253
    def p1copies(self):
44040
f652b7ddc1d4 overlwayworkingctx: remove doubly bad reference to wrapped ctx for copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44025
diff changeset
  2254
        copies = {}
41764
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2255
        narrowmatch = self._repo.narrowmatch()
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2256
        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: 41657
diff changeset
  2257
            if not narrowmatch(f):
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2258
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2259
            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
  2260
            source = self._cache[f][b'copied']
41764
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2261
            if source:
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2262
                copies[f] = source
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2263
        return copies
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2264
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2265
    def p2copies(self):
44040
f652b7ddc1d4 overlwayworkingctx: remove doubly bad reference to wrapped ctx for copies
Martin von Zweigbergk <martinvonz@google.com>
parents: 44025
diff changeset
  2266
        copies = {}
41764
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2267
        narrowmatch = self._repo.narrowmatch()
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2268
        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: 41657
diff changeset
  2269
            if not narrowmatch(f):
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2270
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2271
            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
  2272
            source = self._cache[f][b'copied']
41764
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2273
            if source:
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2274
                copies[f] = source
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2275
        return copies
a4358f7345b4 context: introduce p[12]copies() methods and debugp[12]copies commands
Martin von Zweigbergk <martinvonz@google.com>
parents: 41657
diff changeset
  2276
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  2277
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  2278
        return True
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  2279
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2280
    def filedate(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2281
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2282
            return self._cache[path][b'date']
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2283
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2284
            return self._wrappedctx[path].date()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2285
35302
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2286
    def markcopied(self, path, origin):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2287
        self._markdirty(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2288
            path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2289
            exists=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2290
            date=self.filedate(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2291
            flags=self.flags(path),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2292
            copied=origin,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2293
        )
35302
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2294
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2295
    def copydata(self, path):
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2296
        if self.isdirty(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'copied']
35302
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2298
        else:
42315
cdcebc897529 overlaycontext: allow calling copydata() on clean context
Martin von Zweigbergk <martinvonz@google.com>
parents: 42156
diff changeset
  2299
            return None
35302
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2300
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2301
    def flags(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2302
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2303
            if self._cache[path][b'exists']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2304
                return self._cache[path][b'flags']
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2305
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2306
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2307
                    b"No such file or directory: %s" % self._path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2308
                )
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2309
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2310
            return self._wrappedctx[path].flags()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2311
40456
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2312
    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
  2313
        if key in self._cache:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2314
            return self._cache[key][b'exists']
40456
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2315
        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
  2316
35304
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2317
    def _existsinparent(self, path):
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2318
        try:
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2319
            # ``commitctx` raises a ``ManifestLookupError`` if a path does not
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2320
            # exist, unlike ``workingctx``, which returns a ``workingfilectx``
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2321
            # with an ``exists()`` function.
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2322
            self._wrappedctx[path]
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2323
            return True
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2324
        except error.ManifestLookupError:
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2325
            return False
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2326
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2327
    def _auditconflicts(self, path):
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2328
        """Replicates conflict checks done by wvfs.write().
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2329
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2330
        Since we never write to the filesystem and never call `applyupdates` in
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2331
        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: 35332
diff changeset
  2332
        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: 35332
diff changeset
  2333
        """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2334
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2335
        def fail(path, component):
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2336
            # p1() is the base and we're receiving "writes" for p2()'s
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2337
            # files.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2338
            if b'l' in self.p1()[component].flags():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2339
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2340
                    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
  2341
                    b"in %d." % (path, component, self.p1().rev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2342
                )
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2343
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2344
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2345
                    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
  2346
                    b"%d." % (path, component, self.p1().rev())
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2347
                )
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2348
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2349
        # 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: 35332
diff changeset
  2350
        # 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
  2351
        components = path.split(b'/')
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38816
diff changeset
  2352
        for i in pycompat.xrange(len(components)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2353
            component = b"/".join(components[0:i])
40456
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2354
            if component in self:
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2355
                fail(path, component)
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2356
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2357
        # Test the other direction -- that this path from p2 isn't a directory
40461
1c8c54cf9725 rebase: fix path auditing to audit path relative to repo root (issue5818)
Martin von Zweigbergk <martinvonz@google.com>
parents: 40456
diff changeset
  2358
        # 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
  2359
        match = self.match([path], default=b'path')
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2360
        matches = self.p1().manifest().matches(match)
39592
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39319
diff changeset
  2361
        mfiles = matches.keys()
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39319
diff changeset
  2362
        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: 39319
diff changeset
  2363
            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: 39319
diff changeset
  2364
                return
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39319
diff changeset
  2365
            # omit the files which are deleted in current IMM wctx
40456
44c2e80db985 rebase: fix dir/file conflict detection when using in-mem merge
Martin von Zweigbergk <martinvonz@google.com>
parents: 40302
diff changeset
  2366
            mfiles = [m for m in mfiles if m in self]
39592
fa4d16daf1be context: don't count deleted files as candidates for path conflicts in IMM
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39319
diff changeset
  2367
            if not mfiles:
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2368
                return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2369
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2370
                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
  2371
                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
  2372
                b"entries: %s)"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2373
                % (path, path, self.p1(), len(mfiles), b', '.join(mfiles))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2374
            )
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2375
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2376
    def write(self, path, data, flags=b'', **kwargs):
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2377
        if data is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2378
            raise error.ProgrammingError(b"data must be non-None")
35333
72fbdd373de8 overlayworkingctx: add _auditconflicts to write()
Phil Cohen <phillco@fb.com>
parents: 35332
diff changeset
  2379
        self._auditconflicts(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2380
        self._markdirty(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2381
            path, exists=True, data=data, date=dateutil.makedate(), flags=flags
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2382
        )
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2383
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2384
    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
  2385
        flag = b''
39103
2488dcfa71f8 context: safegaurd from 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38858
diff changeset
  2386
        if l:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2387
            flag = b'l'
39103
2488dcfa71f8 context: safegaurd from 'lx' being passed as file flag in manifest
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 38858
diff changeset
  2388
        elif x:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2389
            flag = b'x'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2390
        self._markdirty(path, exists=True, date=dateutil.makedate(), flags=flag)
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2391
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2392
    def remove(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2393
        self._markdirty(path, exists=False)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2394
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2395
    def exists(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2396
        """exists behaves like `lexists`, but needs to follow symlinks and
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2397
        return False if they are broken.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2398
        """
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2399
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2400
            # If this path exists and is a symlink, "follow" it by calling
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2401
            # exists on the destination path.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2402
            if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2403
                self._cache[path][b'exists']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2404
                and b'l' in self._cache[path][b'flags']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2405
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2406
                return self.exists(self._cache[path][b'data'].strip())
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2407
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2408
                return self._cache[path][b'exists']
35304
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2409
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2410
        return self._existsinparent(path)
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2411
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2412
    def lexists(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2413
        """lexists returns True if the path exists"""
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2414
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2415
            return self._cache[path][b'exists']
35304
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2416
bea46aed1e1b overlayworkingctx: add `_checkexist(path)`
Phil Cohen <phillco@fb.com>
parents: 35303
diff changeset
  2417
        return self._existsinparent(path)
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2418
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2419
    def size(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2420
        if self.isdirty(path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2421
            if self._cache[path][b'exists']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2422
                return len(self._cache[path][b'data'])
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2423
            else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2424
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2425
                    b"No such file or directory: %s" % self._path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2426
                )
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2427
        return self._wrappedctx[path].size()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2428
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2429
    def tomemctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2430
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2431
        text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2432
        branch=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2433
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2434
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2435
        parents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2436
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2437
        editor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2438
    ):
35334
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2439
        """Converts this ``overlayworkingctx`` into a ``memctx`` ready to be
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2440
        committed.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2441
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2442
        ``text`` is the commit message.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2443
        ``parents`` (optional) are rev numbers.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2444
        """
44051
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2445
        # Default parents to the wrapped context if not passed.
35334
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2446
        if parents is None:
44051
436d106de670 overlayworkginctx: implement a setparents() to mirror dirstate.setparents()
Martin von Zweigbergk <martinvonz@google.com>
parents: 44050
diff changeset
  2447
            parents = self.parents()
35334
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2448
            if len(parents) == 1:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2449
                parents = (parents[0], None)
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2450
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2451
        # ``parents`` is passed as rev numbers; convert to ``commitctxs``.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2452
        if parents[1] is None:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2453
            parents = (self._repo[parents[0]], None)
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2454
        else:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2455
            parents = (self._repo[parents[0]], self._repo[parents[1]])
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2456
42317
e79aeb518aa1 overlayworkingctx: don't include added-then-deleted files in memctx
Martin von Zweigbergk <martinvonz@google.com>
parents: 42315
diff changeset
  2457
        files = self.files()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2458
35334
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2459
        def getfile(repo, memctx, path):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2460
            if self._cache[path][b'exists']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2461
                return memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2462
                    repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2463
                    memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2464
                    path,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2465
                    self._cache[path][b'data'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2466
                    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
  2467
                    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
  2468
                    self._cache[path][b'copied'],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2469
                )
35334
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2470
            else:
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2471
                # Returning None, but including the path in `files`, is
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2472
                # necessary for memctx to register a deletion.
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2473
                return None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2474
44050
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 44040
diff changeset
  2475
        if branch is None:
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 44040
diff changeset
  2476
            branch = self._wrappedctx.branch()
2ecbc4ec87d8 overlayworkingctx: default branch to base context's branch
Martin von Zweigbergk <martinvonz@google.com>
parents: 44040
diff changeset
  2477
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2478
        return memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2479
            self._repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2480
            parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2481
            text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2482
            files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2483
            getfile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2484
            date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2485
            extra=extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2486
            user=user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2487
            branch=branch,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2488
            editor=editor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2489
        )
35334
71edd38c4bb4 overlayworkingctx: add ``tomemctx()``
Phil Cohen <phillco@fb.com>
parents: 35333
diff changeset
  2490
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2491
    def isdirty(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2492
        return path in self._cache
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2493
35328
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35304
diff changeset
  2494
    def isempty(self):
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35304
diff changeset
  2495
        # We need to discard any keys that are actually clean before the empty
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35304
diff changeset
  2496
        # commit check.
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35304
diff changeset
  2497
        self._compact()
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35304
diff changeset
  2498
        return len(self._cache) == 0
228916ca12b5 rebase: add concludememorynode(), and call it when rebasing in-memory
Phil Cohen <phillco@fb.com>
parents: 35304
diff changeset
  2499
35295
307b1689e3f8 overlayworkingctx: make clean() public
Phil Cohen <phillco@fb.com>
parents: 35294
diff changeset
  2500
    def clean(self):
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2501
        self._cache = {}
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2502
35335
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2503
    def _compact(self):
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2504
        """Removes keys from the cache that are actually clean, by comparing
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2505
        them with the underlying context.
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2506
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2507
        This can occur during the merge process, e.g. by passing --tool :local
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2508
        to resolve a conflict.
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2509
        """
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2510
        keys = []
41154
f18f665b1424 context: schedule file prefetch before comparing for cleanliness
Kyle Lippincott <spectral@google.com>
parents: 41001
diff changeset
  2511
        # This won't be perfect, but can help performance significantly when
f18f665b1424 context: schedule file prefetch before comparing for cleanliness
Kyle Lippincott <spectral@google.com>
parents: 41001
diff changeset
  2512
        # using things like remotefilelog.
f18f665b1424 context: schedule file prefetch before comparing for cleanliness
Kyle Lippincott <spectral@google.com>
parents: 41001
diff changeset
  2513
        scmutil.prefetchfiles(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2514
            self.repo(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2515
            [self.p1().rev()],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2516
            scmutil.matchfiles(self.repo(), self._cache.keys()),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2517
        )
41154
f18f665b1424 context: schedule file prefetch before comparing for cleanliness
Kyle Lippincott <spectral@google.com>
parents: 41001
diff changeset
  2518
35335
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2519
        for path in self._cache.keys():
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2520
            cache = self._cache[path]
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2521
            try:
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2522
                underlying = self._wrappedctx[path]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2523
                if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2524
                    underlying.data() == cache[b'data']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2525
                    and underlying.flags() == cache[b'flags']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2526
                ):
35335
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2527
                    keys.append(path)
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2528
            except error.ManifestLookupError:
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2529
                # Path not in the underlying manifest (created).
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2530
                continue
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2531
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2532
        for path in keys:
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2533
            del self._cache[path]
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2534
        return keys
dc9da4f4f363 overlayworkingctx: add `_compact()`
Phil Cohen <phillco@fb.com>
parents: 35334
diff changeset
  2535
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2536
    def _markdirty(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2537
        self, path, exists, data=None, date=None, flags=b'', copied=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2538
    ):
39164
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39115
diff changeset
  2539
        # 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: 39115
diff changeset
  2540
        # 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: 39115
diff changeset
  2541
        # the file is marked as existing.
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39115
diff changeset
  2542
        if exists and data is None:
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39115
diff changeset
  2543
            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
  2544
            data = oldentry.get(b'data')
42535
e079e001d536 rebase: fix in-memory rebasing of copy of empty file
Martin von Zweigbergk <martinvonz@google.com>
parents: 42472
diff changeset
  2545
            if data is None:
e079e001d536 rebase: fix in-memory rebasing of copy of empty file
Martin von Zweigbergk <martinvonz@google.com>
parents: 42472
diff changeset
  2546
                data = self._wrappedctx[path].data()
39164
95bd19f60957 overlayworkingctx: fix exception in metadata-only inmemory merges (issue5960)
Kyle Lippincott <spectral@google.com>
parents: 39115
diff changeset
  2547
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2548
        self._cache[path] = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2549
            b'exists': exists,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2550
            b'data': data,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2551
            b'date': date,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2552
            b'flags': flags,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2553
            b'copied': copied,
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2554
        }
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2555
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2556
    def filectx(self, path, filelog=None):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2557
        return overlayworkingfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2558
            self._repo, path, parent=self, filelog=filelog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2559
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2560
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2561
35332
8e1386b342f7 overlayworkingctx: inherit from committablectx instead of workingctx
Phil Cohen <phillco@fb.com>
parents: 35331
diff changeset
  2562
class overlayworkingfilectx(committablefilectx):
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2563
    """Wrap a ``workingfilectx`` but intercepts all writes into an in-memory
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2564
    cache, which can be flushed through later by calling ``flush()``."""
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2565
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2566
    def __init__(self, repo, path, filelog=None, parent=None):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2567
        super(overlayworkingfilectx, self).__init__(repo, path, filelog, parent)
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2568
        self._repo = repo
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2569
        self._parent = parent
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2570
        self._path = path
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2571
34783
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2572
    def cmp(self, fctx):
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2573
        return self.data() != fctx.data()
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2574
35290
010179e21e91 context: switch ctx() use to changectx()
Phil Cohen <phillco@fb.com>
parents: 35280
diff changeset
  2575
    def changectx(self):
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2576
        return self._parent
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2577
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2578
    def data(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2579
        return self._parent.data(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2580
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2581
    def date(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2582
        return self._parent.filedate(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2583
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2584
    def exists(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2585
        return self.lexists()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2586
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2587
    def lexists(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2588
        return self._parent.exists(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2589
41777
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
  2590
    def copysource(self):
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
  2591
        return self._parent.copydata(self._path)
041d829575ed context: add specialized way of getting copy source file only
Martin von Zweigbergk <martinvonz@google.com>
parents: 41775
diff changeset
  2592
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2593
    def size(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2594
        return self._parent.size(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2595
35302
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2596
    def markcopied(self, origin):
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2597
        self._parent.markcopied(self._path, origin)
8b3a636bb341 overlayworkingctx: track copy information in the context
Phil Cohen <phillco@fb.com>
parents: 35298
diff changeset
  2598
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2599
    def audit(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2600
        pass
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2601
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2602
    def flags(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2603
        return self._parent.flags(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2604
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2605
    def setflags(self, islink, isexec):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2606
        return self._parent.setflags(self._path, islink, isexec)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2607
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2608
    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
  2609
        return self._parent.write(self._path, data, flags, **kwargs)
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2610
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2611
    def remove(self, ignoremissing=False):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2612
        return self._parent.remove(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2613
35331
baf58e621363 overlayworkingctx: add a no-op ``clearunknown()``
Phil Cohen <phillco@fb.com>
parents: 35330
diff changeset
  2614
    def clearunknown(self):
baf58e621363 overlayworkingctx: add a no-op ``clearunknown()``
Phil Cohen <phillco@fb.com>
parents: 35330
diff changeset
  2615
        pass
baf58e621363 overlayworkingctx: add a no-op ``clearunknown()``
Phil Cohen <phillco@fb.com>
parents: 35330
diff changeset
  2616
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2617
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2618
class workingcommitctx(workingctx):
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2619
    """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
  2620
    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
  2621
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2622
    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
  2623
    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
  2624
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2625
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2626
    def __init__(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2627
        self, repo, changes, text=b"", user=None, date=None, extra=None
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2628
    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2629
        super(workingcommitctx, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2630
            repo, text, user, date, extra, changes
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2631
        )
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2632
33955
e43264525ce5 context: remove unnecessary default values for matchers (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33954
diff changeset
  2633
    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
  2634
        """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
  2635
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2636
        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
  2637
        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
  2638
        """
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2639
        if clean:
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2640
            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
  2641
        else:
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2642
            clean = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2643
        return scmutil.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2644
            [f for f in self._status.modified if match(f)],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2645
            [f for f in self._status.added if match(f)],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2646
            [f for f in self._status.removed if match(f)],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2647
            [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2648
            [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2649
            [],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2650
            clean,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2651
        )
23712
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2652
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2653
    @propertycache
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2654
    def _changedset(self):
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2655
        """Return the set of files changed in this context
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2656
        """
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2657
        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
  2658
        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
  2659
        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
  2660
        return changed
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2661
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2662
27906
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2663
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
  2664
    """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
  2665
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2666
    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
  2667
    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
  2668
    memctx.
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2669
    """
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2670
    cache = {}
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2671
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2672
    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
  2673
        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
  2674
            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
  2675
        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
  2676
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2677
    return getfilectx
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2678
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2679
32783
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2680
def memfilefromctx(ctx):
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2681
    """Given a context return a memfilectx for ctx[path]
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2682
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2683
    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: 32772
diff changeset
  2684
    context.
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2685
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2686
32783
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2687
    def getfilectx(repo, memctx, path):
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2688
        fctx = ctx[path]
41994
550a172a603b memctx: rename constructor argument "copied" to "copysource" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41972
diff changeset
  2689
        copysource = fctx.copysource()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2690
        return memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2691
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2692
            memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2693
            path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2694
            fctx.data(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2695
            islink=fctx.islink(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2696
            isexec=fctx.isexec(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2697
            copysource=copysource,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2698
        )
32783
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2699
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2700
    return getfilectx
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2701
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2702
32784
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2703
def memfilefrompatch(patchstore):
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2704
    """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: 32783
diff changeset
  2705
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2706
    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: 32783
diff changeset
  2707
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2708
32784
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2709
    def getfilectx(repo, memctx, path):
41994
550a172a603b memctx: rename constructor argument "copied" to "copysource" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41972
diff changeset
  2710
        data, mode, copysource = patchstore.getfile(path)
32784
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2711
        if data is None:
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2712
            return None
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2713
        islink, isexec = mode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2714
        return memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2715
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2716
            memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2717
            path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2718
            data,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2719
            islink=islink,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2720
            isexec=isexec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2721
            copysource=copysource,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2722
        )
32784
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2723
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2724
    return getfilectx
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2725
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2726
21665
d2743be1bb06 memctx: inherit from committablectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21664
diff changeset
  2727
class memctx(committablectx):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2728
    """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
  2729
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2730
    Revision information is supplied at initialization time while
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2731
    related files data and is made available through a callback
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2732
    mechanism.  'repo' is the current localrepo, 'parents' is a
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2733
    sequence of two parent revisions identifiers (pass None for every
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2734
    missing parent), 'text' is the commit message and 'files' lists
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2735
    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
  2736
    repository root).
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2737
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2738
    filectxfn(repo, memctx, path) is a callable receiving the
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2739
    repository, the current memctx object and the normalized path of
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2740
    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
  2741
    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
  2742
    undefined. If the file is available in the revision being
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2743
    committed (updated or added), filectxfn returns a memfilectx
31617
c93cdfa131a8 misc: update descriptions about removed file for filectxfn
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 31483
diff changeset
  2744
    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: 31483
diff changeset
  2745
    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
  2746
    removed and the new file added with copy information (see
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2747
    memfilectx).
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2748
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2749
    user receives the committer name and defaults to current
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2750
    repository username, date is the commit date in any format
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36441
diff changeset
  2751
    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
  2752
    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
  2753
    """
22313
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2754
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2755
    # 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
  2756
    # 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
  2757
    # 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
  2758
    _returnnoneformissingfiles = True
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2759
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2760
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2761
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2762
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2763
        parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2764
        text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2765
        files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2766
        filectxfn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2767
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2768
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2769
        extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2770
        branch=None,
44025
3216cabffd4a commit: change default `editor` parameter to None
Matt Harbison <matt_harbison@yahoo.com>
parents: 44012
diff changeset
  2771
        editor=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2772
    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2773
        super(memctx, self).__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2774
            repo, text, user, date, extra, branch=branch
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2775
        )
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2776
        self._rev = None
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2777
        self._node = None
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2778
        parents = [(p or nullid) for p in parents]
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2779
        p1, p2 = parents
37175
05ff1a155a21 memctx: create parent contexts using "repo[p]" syntax
Martin von Zweigbergk <martinvonz@google.com>
parents: 37173
diff changeset
  2780
        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
  2781
        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
  2782
        self._files = files
21938
c8411fb5dfef memctx: substate needs to be {} instead of None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21895
diff changeset
  2783
        self.substate = {}
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2784
32785
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2785
        if isinstance(filectxfn, patch.filestore):
32801
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2786
            filectxfn = memfilefrompatch(filectxfn)
32785
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2787
        elif not callable(filectxfn):
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2788
            # if store is not callable, wrap it in a function
32801
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2789
            filectxfn = memfilefromctx(filectxfn)
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2790
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2791
        # memoizing increases performance for e.g. vcs convert scenarios.
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2792
        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
  2793
21238
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2794
        if editor:
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2795
            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
  2796
            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
  2797
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2798
    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
  2799
        """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
  2800
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22207
diff changeset
  2801
        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
  2802
        return self._filectxfn(self._repo, self, path)
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2803
11151
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2804
    def commit(self):
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2805
        """commit context to the repo"""
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2806
        return self._repo.commitctx(self)
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2807
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2808
    @propertycache
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2809
    def _manifest(self):
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2810
        """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
  2811
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2812
        # 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
  2813
        pctx = self._parents[0]
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2814
        man = pctx.manifest().copy()
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2815
23603
d74eb8d477d5 memctx: calculate manifest more efficiently
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23602
diff changeset
  2816
        for f in self._status.modified:
39729
a5dafefc4a53 memctx: simplify _manifest with new revlog nodeids
Sean Farley <sean@farley.io>
parents: 39728
diff changeset
  2817
            man[f] = modifiednodeid
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2818
23588
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2819
        for f in self._status.added:
39729
a5dafefc4a53 memctx: simplify _manifest with new revlog nodeids
Sean Farley <sean@farley.io>
parents: 39728
diff changeset
  2820
            man[f] = addednodeid
23588
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2821
23589
200215cdf7aa memctx: calculate manifest correctly with newly-removed files (issue4470)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23588
diff changeset
  2822
        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
  2823
            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
  2824
                del man[f]
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2825
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2826
        return man
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2827
23587
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2828
    @propertycache
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2829
    def _status(self):
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2830
        """Calculate exact status from ``files`` specified at construction
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2831
        """
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2832
        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
  2833
        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
  2834
        # "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
  2835
        # 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
  2836
        # explicitly initialized by the list, of which length is 2.
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2837
        if p2.node() != nullid:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2838
            man2 = p2.manifest()
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2839
            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
  2840
        else:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2841
            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
  2842
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2843
        modified, added, removed = [], [], []
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2844
        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
  2845
            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
  2846
                added.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2847
            elif self[f]:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2848
                modified.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2849
            else:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2850
                removed.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2851
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2852
        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
  2853
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2854
21688
cc677803bad4 memfilectx: inherit from committablefilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21687
diff changeset
  2855
class memfilectx(committablefilectx):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2856
    """memfilectx represents an in-memory file to commit.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2857
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23110
diff changeset
  2858
    See memctx and committablefilectx for more details.
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2859
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2860
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2861
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2862
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2863
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2864
        changectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2865
        path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2866
        data,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2867
        islink=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2868
        isexec=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2869
        copysource=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2870
    ):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2871
        """
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2872
        path is the normalized file path relative to repository root.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2873
        data is the file content as a string.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2874
        islink is True if the file is a symbolic link.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2875
        isexec is True if the file is executable.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2876
        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
  2877
        revision being committed, or None."""
35407
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35362
diff changeset
  2878
        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
  2879
        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
  2880
        if islink:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2881
            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
  2882
        elif isexec:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2883
            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
  2884
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  2885
            self._flags = b''
41995
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2886
        self._copysource = copysource
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2887
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2888
    def copysource(self):
6fef387af1da memfilectx: override copysource() instead of using dummy nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 41994
diff changeset
  2889
        return self._copysource
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2890
40470
328557af18eb context: reimplement memfilectx.cmp()
Yuya Nishihara <yuya@tcha.org>
parents: 40461
diff changeset
  2891
    def cmp(self, fctx):
328557af18eb context: reimplement memfilectx.cmp()
Yuya Nishihara <yuya@tcha.org>
parents: 40461
diff changeset
  2892
        return self.data() != fctx.data()
328557af18eb context: reimplement memfilectx.cmp()
Yuya Nishihara <yuya@tcha.org>
parents: 40461
diff changeset
  2893
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2894
    def data(self):
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2895
        return self._data
22074
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2896
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2897
    def remove(self, ignoremissing=False):
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2898
        """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
  2899
        # 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
  2900
        del self._changectx[self._path]
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2901
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  2902
    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
  2903
        """wraps repo.wwrite"""
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2904
        self._data = data
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2905
32283
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2906
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2907
class metadataonlyctx(committablectx):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2908
    """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: 30371
diff changeset
  2909
    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: 30371
diff changeset
  2910
    metadata-only changes.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2911
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2912
    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: 30371
diff changeset
  2913
    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: 30371
diff changeset
  2914
    '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: 30371
diff changeset
  2915
    every missing parent), 'text' is the commit.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2916
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2917
    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: 30371
diff changeset
  2918
    username, date is the commit date in any format supported by
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36441
diff changeset
  2919
    dateutil.parsedate() and defaults to current date, extra is a dictionary of
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2920
    metadata or is left empty.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2921
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2922
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2923
    def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2924
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2925
        repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2926
        originalctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2927
        parents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2928
        text=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2929
        user=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2930
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2931
        extra=None,
44025
3216cabffd4a commit: change default `editor` parameter to None
Matt Harbison <matt_harbison@yahoo.com>
parents: 44012
diff changeset
  2932
        editor=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2933
    ):
34016
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2934
        if text is None:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2935
            text = originalctx.description()
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2936
        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: 30371
diff changeset
  2937
        self._rev = None
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2938
        self._node = None
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2939
        self._originalctx = originalctx
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2940
        self._manifestnode = originalctx.manifestnode()
34016
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2941
        if parents is None:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2942
            parents = originalctx.parents()
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2943
        else:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2944
            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: 33955
diff changeset
  2945
        parents = parents[:]
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2946
        while len(parents) < 2:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2947
            parents.append(repo[nullid])
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2948
        p1, p2 = self._parents = parents
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2949
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2950
        # 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: 30371
diff changeset
  2951
        # manifests of our commit parents
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2952
        mp1, mp2 = self.manifestctx().parents
31840
7973e0a15bd4 metadataonlyctx: replace "changeset()[0]" to "manifestnode()"
Jun Wu <quark@fb.com>
parents: 31668
diff changeset
  2953
        if p1 != nullid and p1.manifestnode() != mp1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2954
            raise RuntimeError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2955
                r"can't reuse the manifest: its p1 "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2956
                r"doesn't match the new ctx p1"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2957
            )
31840
7973e0a15bd4 metadataonlyctx: replace "changeset()[0]" to "manifestnode()"
Jun Wu <quark@fb.com>
parents: 31668
diff changeset
  2958
        if p2 != nullid and p2.manifestnode() != mp2:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2959
            raise RuntimeError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2960
                r"can't reuse the manifest: "
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2961
                r"its p2 doesn't match the new ctx p2"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  2962
            )
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2963
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2964
        self._files = originalctx.files()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2965
        self.substate = {}
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2966
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2967
        if editor:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2968
            self._text = editor(self._repo, self, [])
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2969
            self._repo.savecommitmessage(self._text)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2970
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2971
    def manifestnode(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2972
        return self._manifestnode
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2973
32552
6ae068f801e3 context: do not cache manifestctx
Jun Wu <quark@fb.com>
parents: 32519
diff changeset
  2974
    @property
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2975
    def _manifestctx(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2976
        return self._repo.manifestlog[self._manifestnode]
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2977
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2978
    def filectx(self, path, filelog=None):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2979
        return self._originalctx.filectx(path, filelog=filelog)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2980
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2981
    def commit(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2982
        """commit context to the repo"""
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2983
        return self._repo.commitctx(self)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2984
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2985
    @property
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2986
    def _manifest(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2987
        return self._originalctx.manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2988
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2989
    @propertycache
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2990
    def _status(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2991
        """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: 30371
diff changeset
  2992
        and parents manifests.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2993
        """
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2994
        man1 = self.p1().manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2995
        p2 = self._parents[1]
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2996
        # "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: 30371
diff changeset
  2997
        # 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: 30371
diff changeset
  2998
        # explicitly initialized by the list, of which length is 2.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2999
        if p2.node() != nullid:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3000
            man2 = p2.manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3001
            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: 30371
diff changeset
  3002
        else:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3003
            managing = lambda f: f in man1
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3004
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3005
        modified, added, removed = [], [], []
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3006
        for f in self._files:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3007
            if not managing(f):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3008
                added.append(f)
34017
be814edf3306 metadataonlyctx: don't crash when reusing the manifest with deletions
Jun Wu <quark@fb.com>
parents: 34016
diff changeset
  3009
            elif f in self:
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3010
                modified.append(f)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3011
            else:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3012
                removed.append(f)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3013
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  3014
        return scmutil.status(modified, added, removed, [], [], [], [])
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3015
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  3016
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3017
class arbitraryfilectx(object):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3018
    """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: 34054
diff changeset
  3019
    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: 34054
diff changeset
  3020
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43025
diff changeset
  3021
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3022
    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
  3023
        # 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
  3024
        self._repo = repo
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3025
        self._path = path
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3026
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  3027
    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
  3028
        # 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
  3029
        # 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
  3030
        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
  3031
        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
  3032
            # 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
  3033
            # 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
  3034
            # 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
  3035
            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
  3036
        return self.data() != fctx.data()
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3037
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3038
    def path(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3039
        return self._path
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3040
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3041
    def flags(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3042
        return b''
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3043
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3044
    def data(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3045
        return util.readfile(self._path)
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3046
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3047
    def decodeddata(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3048
        with open(self._path, b"rb") as f:
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3049
            return f.read()
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3050
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3051
    def remove(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3052
        util.unlink(self._path)
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3053
35725
2a7e777c9eed write: add the possibility to pass keyword argument from batchget to vfs
Boris Feld <boris.feld@octobus.net>
parents: 35610
diff changeset
  3054
    def write(self, data, flags, **kwargs):
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3055
        assert not flags
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  3056
        with open(self._path, b"wb") as f:
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  3057
            f.write(data)