mercurial/context.py
author Saurabh Singh <singhsrb@fb.com>
Tue, 17 Oct 2017 13:20:25 -0700
changeset 34882 e9f320a40b44
parent 34835 14c87708f432
child 34926 f7e4d6c20095
permissions -rw-r--r--
ui: move request exit handlers to global state Since the ui objects can be created with the 'load' class method, it is possible to lose the exit handlers information from the old ui instance. For example, running 'test-bad-extension.t' leads to this situation where chg creates a new ui instance which does not copy the exit handlers from the earlier ui instance. For exit handlers, which are special cases anyways, it probably makes sense to have a global state of the handlers. This would ensure that the exit handlers registered once are definitely executed at the end of the request. Test Plan: Ran all the tests without '--chg' option. This also fixes the 'test-bad-extension.t' with the '--chg' option. Differential Revision: https://phab.mercurial-scm.org/D1166
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
26604
a3fcc8e3136b context: don't hex encode all unknown 20 char revision specs (issue4890)
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
    13
import re
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    14
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
    15
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    16
from .i18n import _
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    17
from .node import (
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30370
diff changeset
    18
    addednodeid,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    19
    bin,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    20
    hex,
30371
1070df141718 dirstate: change added/modified placeholder hash length to 20 bytes
Durham Goode <durham@fb.com>
parents: 30370
diff changeset
    21
    modifiednodeid,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    22
    nullid,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    23
    nullrev,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    24
    short,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    25
    wdirid,
31268
c414e339e7af status: handle more node indicators in buildstatus
Durham Goode <durham@fb.com>
parents: 31093
diff changeset
    26
    wdirnodes,
32680
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32674
diff changeset
    27
    wdirrev,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    28
)
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
    29
from .thirdparty import (
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
    30
    attr,
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
    31
)
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    32
from . import (
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
    mdiff,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    38
    obsolete as obsmod,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    39
    patch,
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
    40
    pathutil,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    41
    phases,
31352
ff2f90503d64 context: work around `long` not existing on Python 3
Augie Fackler <augie@google.com>
parents: 31318
diff changeset
    42
    pycompat,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    43
    repoview,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    44
    revlog,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    45
    scmutil,
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
    46
    sparse,
27506
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    47
    subrepo,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    48
    util,
e6d3dad71e44 context: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27234
diff changeset
    49
)
3122
da85145d4571 filectx: add rename traversal for parents()
Matt Mackall <mpm@selenic.com>
parents: 2859
diff changeset
    50
8207
dd8d5be57d65 util: take propertycache from context.py
Matt Mackall <mpm@selenic.com>
parents: 8157
diff changeset
    51
propertycache = util.propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
    52
26604
a3fcc8e3136b context: don't hex encode all unknown 20 char revision specs (issue4890)
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
    53
nonascii = re.compile(r'[^\x21-\x7f]').search
a3fcc8e3136b context: don't hex encode all unknown 20 char revision specs (issue4890)
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
    54
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
    55
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
    56
    """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
    57
    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
    58
    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
    59
                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
    60
    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
    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
    def __new__(cls, repo, changeid='', *args, **kwargs):
19538
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    63
        if isinstance(changeid, basectx):
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    64
            return changeid
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    65
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    66
        o = super(basectx, cls).__new__(cls)
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    67
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    68
        o._repo = repo
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    69
        o._rev = nullrev
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    70
        o._node = nullid
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    71
049d6b5a4a59 basectx: return a copied context if changeid is already a basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19537
diff changeset
    72
        return o
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
    73
31353
c99371e38e5e context: implement both __bytes__ and __str__ for Python 3
Augie Fackler <augie@google.com>
parents: 31352
diff changeset
    74
    def __bytes__(self):
19540
7b864da00e21 basectx: move __str__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19539
diff changeset
    75
        return short(self.node())
7b864da00e21 basectx: move __str__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19539
diff changeset
    76
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
    77
    __str__ = encoding.strmethod(__bytes__)
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
    78
19545
5af7045b0b18 basectx: move __int__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19544
diff changeset
    79
    def __int__(self):
5af7045b0b18 basectx: move __int__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19544
diff changeset
    80
        return self.rev()
5af7045b0b18 basectx: move __int__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19544
diff changeset
    81
19546
a45cf68dd9a2 basectx: move __repr__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19545
diff changeset
    82
    def __repr__(self):
32636
e7eb7494e98d py3: make sure we return strings from __str__ and __repr__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32633
diff changeset
    83
        return r"<%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
    84
19547
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    85
    def __eq__(self, other):
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    86
        try:
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    87
            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
    88
        except AttributeError:
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    89
            return False
0537c0cfd87c basectx: move __eq__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19546
diff changeset
    90
19548
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    91
    def __ne__(self, other):
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    92
        return not (self == other)
730fdcaa791d basectx: move __ne__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19547
diff changeset
    93
19550
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    94
    def __contains__(self, key):
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    95
        return key in self._manifest
0c8ad779eb36 basectx: move __contains__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19549
diff changeset
    96
19551
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    97
    def __getitem__(self, key):
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    98
        return self.filectx(key)
e07c69145724 basectx: move __getitem__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19550
diff changeset
    99
19552
6b76070c4b54 basectx: move __iter__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19551
diff changeset
   100
    def __iter__(self):
24227
8ec2df32bd39 context: don't sort manifest entries
Augie Fackler <augie@google.com>
parents: 24213
diff changeset
   101
        return iter(self._manifest)
19552
6b76070c4b54 basectx: move __iter__ from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19551
diff changeset
   102
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   103
    def _buildstatusmanifest(self, status):
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   104
        """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
   105
        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
   106
        the normal manifest."""
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   107
        return self.manifest()
21880
e6754f5e4cf7 context: generate filtered manifest efficiently for exact matchers
Siddharth Agarwal <sid0@fb.com>
parents: 21845
diff changeset
   108
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
   109
    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
   110
        """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
   111
        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
   112
        """
33954
c714e82b9ac2 context: always pass a matcher into _matchstatus() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33919
diff changeset
   113
        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
   114
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   115
    def _buildstatus(self, other, s, match, listignored, listclean,
21663
8d9449eaaeff context: fix wrong indentation from renaming method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21616
diff changeset
   116
                     listunknown):
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   117
        """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
   118
        # 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
   119
        # 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
   120
        # 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
   121
        # 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
   122
        # 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
   123
        # delta application.
31270
aac054e5389b context: remove assumptions about manifest creation during _buildstatus
Durham Goode <durham@fb.com>
parents: 31269
diff changeset
   124
        mf2 = None
23238
39eb9f78f968 context.status: move manifest caching trick to _buildstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23237
diff changeset
   125
        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
   126
            mf2 = self._buildstatusmanifest(s)
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   127
        mf1 = other._buildstatusmanifest(s)
31270
aac054e5389b context: remove assumptions about manifest creation during _buildstatus
Durham Goode <durham@fb.com>
parents: 31269
diff changeset
   128
        if mf2 is None:
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   129
            mf2 = self._buildstatusmanifest(s)
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   130
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   131
        modified, added = [], []
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   132
        removed = []
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   133
        clean = []
23304
dd3f857598a0 context.status: pass status tuple into _buildstatus
Martin von Zweigbergk <martinvonz@google.com>
parents: 23303
diff changeset
   134
        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
   135
        deletedset = set(deleted)
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   136
        d = mf1.diff(mf2, match=match, clean=listclean)
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   137
        for fn, value in d.iteritems():
23731
ccbaa2ed11a4 status: don't list files as both clean and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23730
diff changeset
   138
            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
   139
                continue
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   140
            if value is None:
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   141
                clean.append(fn)
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   142
                continue
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   143
            (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
   144
            if node1 is None:
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   145
                added.append(fn)
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   146
            elif node2 is None:
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   147
                removed.append(fn)
27749
215b47449e47 context: check for differing flags a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 27748
diff changeset
   148
            elif flag1 != flag2:
215b47449e47 context: check for differing flags a little earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 27748
diff changeset
   149
                modified.append(fn)
31268
c414e339e7af status: handle more node indicators in buildstatus
Durham Goode <durham@fb.com>
parents: 31093
diff changeset
   150
            elif node2 not in wdirnodes:
27748
81b391a45264 context: clarify why we don't compare file contents when nodeid differs
Martin von Zweigbergk <martinvonz@google.com>
parents: 27747
diff changeset
   151
                # 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
   152
                # 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
   153
                # 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
   154
                # to a file as a modification.
27747
54522bbe1597 status: back out changeset 89f49813526c
Martin von Zweigbergk <martinvonz@google.com>
parents: 27720
diff changeset
   155
                modified.append(fn)
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   156
            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
   157
                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
   158
            else:
23757
b5346480a490 context: use new manifest.diff(clean=True) support
Augie Fackler <augie@google.com>
parents: 23755
diff changeset
   159
                clean.append(fn)
23755
d43948a910a5 context: use manifest.diff() to compute most of status
Augie Fackler <augie@google.com>
parents: 23731
diff changeset
   160
21971
412ac613fd89 status: explicitly exclude removed file from unknown and ignored
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21938
diff changeset
   161
        if removed:
412ac613fd89 status: explicitly exclude removed file from unknown and ignored
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21938
diff changeset
   162
            # need to filter files if they are already reported as removed
31271
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   163
            unknown = [fn for fn in unknown if fn not in mf1 and
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   164
                                               (not match or match(fn))]
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   165
            ignored = [fn for fn in ignored if fn not in mf1 and
bd884ef2ee46 context: remove uses of manifest.matches
Durham Goode <durham@fb.com>
parents: 31270
diff changeset
   166
                                               (not match or match(fn))]
23730
4b56219a5ac2 status: don't list files as both removed and deleted
Martin von Zweigbergk <martinvonz@google.com>
parents: 23712
diff changeset
   167
            # 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
   168
            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
   169
23302
24f67ad49da7 context.status: make _dirstatestatus() return an status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23301
diff changeset
   170
        return scmutil.status(modified, added, removed, deleted, unknown,
24f67ad49da7 context.status: make _dirstatestatus() return an status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23301
diff changeset
   171
                              ignored, clean)
21471
90aff492dc4a context: add _buildstatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21468
diff changeset
   172
19549
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   173
    @propertycache
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   174
    def substate(self):
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   175
        return subrepo.state(self, self._repo.ui)
78155484ae34 basectx: move substate from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19548
diff changeset
   176
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
   177
    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
   178
        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
   179
19541
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   180
    def rev(self):
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   181
        return self._rev
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
19543
18f4951222f4 basectx: move hex from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19542
diff changeset
   184
    def hex(self):
19544
74924fa3236d basectx: change _node to node() in hex
Sean Farley <sean.michael.farley@gmail.com>
parents: 19543
diff changeset
   185
        return hex(self.node())
19553
64a99d972b9e basectx: move manifest from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19552
diff changeset
   186
    def manifest(self):
64a99d972b9e basectx: move manifest from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19552
diff changeset
   187
        return self._manifest
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   188
    def manifestctx(self):
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   189
        return self._manifestctx
24300
a07314472a80 context: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24227
diff changeset
   190
    def repo(self):
a07314472a80 context: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24227
diff changeset
   191
        return self._repo
19554
98f8875f4baa basectx: move phasestr from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19553
diff changeset
   192
    def phasestr(self):
98f8875f4baa basectx: move phasestr from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19553
diff changeset
   193
        return phases.phasenames[self.phase()]
19555
613b70fedc4e basectx: move mutable from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19554
diff changeset
   194
    def mutable(self):
613b70fedc4e basectx: move mutable from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19554
diff changeset
   195
        return self.phase() > phases.public
19541
421d49f2f8e2 basectx: move rev from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19540
diff changeset
   196
20400
f0137d994c83 context: add a getfileset() method so fewer things need fileset directly
Augie Fackler <raf@durin42.com>
parents: 20292
diff changeset
   197
    def getfileset(self, expr):
f0137d994c83 context: add a getfileset() method so fewer things need fileset directly
Augie Fackler <raf@durin42.com>
parents: 20292
diff changeset
   198
        return fileset.getfileset(self, expr)
f0137d994c83 context: add a getfileset() method so fewer things need fileset directly
Augie Fackler <raf@durin42.com>
parents: 20292
diff changeset
   199
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   200
    def obsolete(self):
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   201
        """True if the changeset is obsolete"""
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   202
        return self.rev() in obsmod.getrevs(self._repo, 'obsolete')
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   203
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   204
    def extinct(self):
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   205
        """True if the changeset is extinct"""
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   206
        return self.rev() in obsmod.getrevs(self._repo, 'extinct')
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   207
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   208
    def unstable(self):
33753
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   209
        msg = ("'context.unstable' is deprecated, "
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   210
               "use 'context.orphan'")
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   211
        self._repo.ui.deprecwarn(msg, '4.4')
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   212
        return self.orphan()
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   213
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   214
    def orphan(self):
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   215
        """True if the changeset is not obsolete but it's ancestor are"""
33798
d4b7496f7d0b obsolete: rename unstable volatile set into orphan volatile set
Boris Feld <boris.feld@octobus.net>
parents: 33756
diff changeset
   216
        return self.rev() in obsmod.getrevs(self._repo, 'orphan')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   217
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   218
    def bumped(self):
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   219
        msg = ("'context.bumped' is deprecated, "
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   220
               "use 'context.phasedivergent'")
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   221
        self._repo.ui.deprecwarn(msg, '4.4')
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   222
        return self.phasedivergent()
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   223
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   224
    def phasedivergent(self):
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   225
        """True if the changeset try to be a successor of a public changeset
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   226
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   227
        Only non-public and non-obsolete changesets may be bumped.
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   228
        """
33800
9fa874fb34e1 obsolete: rename bumped volatile set into phasedivergent volatile set
Boris Feld <boris.feld@octobus.net>
parents: 33799
diff changeset
   229
        return self.rev() in obsmod.getrevs(self._repo, 'phasedivergent')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   230
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   231
    def divergent(self):
33754
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   232
        msg = ("'context.divergent' is deprecated, "
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   233
               "use 'context.contentdivergent'")
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   234
        self._repo.ui.deprecwarn(msg, '4.4')
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   235
        return self.contentdivergent()
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   236
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   237
    def contentdivergent(self):
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   238
        """Is a successors of a changeset with multiple possible successors set
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   239
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   240
        Only non-public and non-obsolete changesets may be divergent.
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   241
        """
33799
f3f06c260e9e obsolete: rename divergent volatile set into contentdivergent volatile set
Boris Feld <boris.feld@octobus.net>
parents: 33798
diff changeset
   242
        return self.rev() in obsmod.getrevs(self._repo, 'contentdivergent')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   243
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   244
    def troubled(self):
33756
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33755
diff changeset
   245
        msg = ("'context.troubled' is deprecated, "
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33755
diff changeset
   246
               "use 'context.isunstable'")
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33755
diff changeset
   247
        self._repo.ui.deprecwarn(msg, '4.4')
33818
4abf34f47526 context: fix troubled deprecation
Boris Feld <boris.feld@octobus.net>
parents: 33800
diff changeset
   248
        return self.isunstable()
33756
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33755
diff changeset
   249
52c5ff856b49 context: rename troubled into isunstable
Boris Feld <boris.feld@octobus.net>
parents: 33755
diff changeset
   250
    def isunstable(self):
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   251
        """True if the changeset is either unstable, bumped or divergent"""
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   252
        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
   253
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   254
    def troubles(self):
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   255
        """Keep the old version around in order to avoid breaking extensions
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   256
        about different return values.
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   257
        """
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   258
        msg = ("'context.troubles' is deprecated, "
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   259
               "use 'context.instabilities'")
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   260
        self._repo.ui.deprecwarn(msg, '4.4')
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   261
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   262
        troubles = []
33753
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   263
        if self.orphan():
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   264
            troubles.append('orphan')
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   265
        if self.phasedivergent():
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   266
            troubles.append('bumped')
33754
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   267
        if self.contentdivergent():
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   268
            troubles.append('divergent')
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   269
        return troubles
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   270
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   271
    def instabilities(self):
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   272
        """return the list of instabilities affecting this changeset.
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   273
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   274
        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
   275
        - orphan,
33715
9c27a2891b75 evolution: rename bumped to phase-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33714
diff changeset
   276
        - phase-divergent,
33714
2194a8723138 evolution: rename divergent to content-divergent
Boris Feld <boris.feld@octobus.net>
parents: 33695
diff changeset
   277
        - content-divergent.
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   278
        """
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   279
        instabilities = []
33753
f163edb45c47 context: rename unstable into orphan
Boris Feld <boris.feld@octobus.net>
parents: 33752
diff changeset
   280
        if self.orphan():
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   281
            instabilities.append('orphan')
33755
8413cbeae275 context: rename bumped into phasedivergent
Boris Feld <boris.feld@octobus.net>
parents: 33754
diff changeset
   282
        if self.phasedivergent():
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   283
            instabilities.append('phase-divergent')
33754
8b2d7684407b context: rename divergent into contentdivergent
Boris Feld <boris.feld@octobus.net>
parents: 33753
diff changeset
   284
        if self.contentdivergent():
33752
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   285
            instabilities.append('content-divergent')
ab0c55c2ad9a context: rename troubles into instabilities
Boris Feld <boris.feld@octobus.net>
parents: 33715
diff changeset
   286
        return instabilities
19734
e61c6138fa33 context: move evolution functions from changectx to basectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19733
diff changeset
   287
19556
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   288
    def parents(self):
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   289
        """return contexts for each parent changeset"""
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   290
        return self._parents
732ee7fff35a basectx: move parents from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19555
diff changeset
   291
19557
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   292
    def p1(self):
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   293
        return self._parents[0]
9f57ebf0cce8 basectx: move p1 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19556
diff changeset
   294
19558
d0448e9d4554 basectx: move p2 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19557
diff changeset
   295
    def p2(self):
27064
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   296
        parents = self._parents
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   297
        if len(parents) == 2:
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   298
            return parents[1]
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
   299
        return changectx(self._repo, nullrev)
19558
d0448e9d4554 basectx: move p2 from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19557
diff changeset
   300
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   301
    def _fileinfo(self, path):
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
   302
        if r'_manifest' in self.__dict__:
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   303
            try:
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   304
                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
   305
            except KeyError:
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   306
                raise error.ManifestLookupError(self._node, path,
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   307
                                                _('not found in manifest'))
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
   308
        if r'_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
   309
            if path in self._manifestdelta:
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   310
                return (self._manifestdelta[path],
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   311
                        self._manifestdelta.flags(path))
30350
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   312
        mfl = self._repo.manifestlog
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   313
        try:
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   314
            node, flag = mfl[self._changeset.manifest].find(path)
608ba935e041 manifest: remove manifest.find
Durham Goode <durham@fb.com>
parents: 30289
diff changeset
   315
        except KeyError:
19559
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   316
            raise error.ManifestLookupError(self._node, path,
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   317
                                            _('not found in manifest'))
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   318
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   319
        return node, flag
80ad9fe22e18 basectx: move _fileinfo from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19558
diff changeset
   320
19560
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   321
    def filenode(self, path):
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   322
        return self._fileinfo(path)[0]
f256e1108053 basectx: move filenode from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19559
diff changeset
   323
19561
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   324
    def flags(self, path):
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   325
        try:
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   326
            return self._fileinfo(path)[1]
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   327
        except error.LookupError:
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   328
            return ''
7806e63598b0 basectx: move flags from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19560
diff changeset
   329
29021
92d37fb3f1aa verify: don't init subrepo when missing one is referenced (issue5128) (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 28488
diff changeset
   330
    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
   331
        '''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
   332
        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
   333
25417
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   334
    def nullsub(self, path, pctx):
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   335
        return subrepo.nullsubrepo(self, path, pctx)
95c271356a66 context: introduce the nullsub() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 25303
diff changeset
   336
25600
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   337
    def workingsub(self, path):
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   338
        '''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
   339
        context.
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   340
        '''
70ac1868b707 subrepo: allow a representation of the working directory subrepo
Matt Harbison <matt_harbison@yahoo.com>
parents: 25590
diff changeset
   341
        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
   342
31397
9e57033fec0c context: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31360
diff changeset
   343
    def match(self, pats=None, include=None, exclude=None, default='glob',
25465
f472228a9e5e context: add an optional constructor parameter for a match.bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25435
diff changeset
   344
              listsubrepos=False, badfn=None):
19563
87503cd824fa basectx: move match from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19562
diff changeset
   345
        r = self._repo
31446
084050d76e4f context: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31397
diff changeset
   346
        return matchmod.match(r.root, r.getcwd(), pats,
19563
87503cd824fa basectx: move match from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19562
diff changeset
   347
                              include, exclude, default,
27234
15c6eb0a51bd context: use a the nofsauditor when matching file in history (issue4749)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27183
diff changeset
   348
                              auditor=r.nofsauditor, ctx=self,
25465
f472228a9e5e context: add an optional constructor parameter for a match.bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25435
diff changeset
   349
                              listsubrepos=listsubrepos, badfn=badfn)
19563
87503cd824fa basectx: move match from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19562
diff changeset
   350
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   351
    def diff(self, ctx2=None, match=None, **opts):
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   352
        """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
   353
        if ctx2 is None:
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   354
            ctx2 = self.p1()
19568
f58235d85d6b basectx: remove unnecessary check of instance
Sean Farley <sean.michael.farley@gmail.com>
parents: 19567
diff changeset
   355
        if ctx2 is not None:
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   356
            ctx2 = self._repo[ctx2]
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   357
        diffopts = patch.diffopts(self._repo.ui, opts)
21834
e4d35aa9056c basectx: pass raw context objects to patch.diff
Sean Farley <sean.michael.farley@gmail.com>
parents: 21722
diff changeset
   358
        return patch.diff(self._repo, ctx2, self, match=match, opts=diffopts)
19564
f0ed47b73d37 basectx: move diff from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19563
diff changeset
   359
24323
4c7c6beade1a manifest: have context's dirs() call its manifest's dirs()
Drew Gottlieb <drgott@google.com>
parents: 24306
diff changeset
   360
    def dirs(self):
4c7c6beade1a manifest: have context's dirs() call its manifest's dirs()
Drew Gottlieb <drgott@google.com>
parents: 24306
diff changeset
   361
        return self._manifest.dirs()
19565
bd1580a9c133 basectx: move _dirs from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19564
diff changeset
   362
24325
79d9c51488ca manifest: add hasdir() to context
Drew Gottlieb <drgott@google.com>
parents: 24323
diff changeset
   363
    def hasdir(self, dir):
79d9c51488ca manifest: add hasdir() to context
Drew Gottlieb <drgott@google.com>
parents: 24323
diff changeset
   364
        return self._manifest.hasdir(dir)
19566
54817c774d38 basectx: move dirs from changectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19565
diff changeset
   365
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   366
    def status(self, other=None, match=None, listignored=False,
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   367
               listclean=False, listunknown=False, listsubrepos=False):
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   368
        """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
   369
        directory.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   370
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   371
        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
   372
ee29b0bb1619 status: document the content of the returned tuple in the docstring
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21718
diff changeset
   373
        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
   374
        """
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   375
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   376
        ctx1 = self
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   377
        ctx2 = self._repo[other]
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   378
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   379
        # 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
   380
        # 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
   381
        # 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
   382
        # with its first parent.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   383
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   384
        # 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
   385
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   386
        # workingctx.status(parentctx)
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   387
        #
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   388
        # 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
   389
        # 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
   390
        # just copy the manifest of the parent.
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   391
        reversed = False
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   392
        if (not isinstance(ctx1, changectx)
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   393
            and isinstance(ctx2, changectx)):
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   394
            reversed = True
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   395
            ctx1, ctx2 = ctx2, ctx1
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   396
33954
c714e82b9ac2 context: always pass a matcher into _matchstatus() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33919
diff changeset
   397
        match = match or matchmod.always(self._repo.root, self._repo.getcwd())
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
   398
        match = ctx2._matchstatus(ctx1, match)
23304
dd3f857598a0 context.status: pass status tuple into _buildstatus
Martin von Zweigbergk <martinvonz@google.com>
parents: 23303
diff changeset
   399
        r = scmutil.status([], [], [], [], [], [], [])
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   400
        r = ctx2._buildstatus(ctx1, r, match, listignored, listclean,
21663
8d9449eaaeff context: fix wrong indentation from renaming method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21616
diff changeset
   401
                              listunknown)
21594
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
        if reversed:
23301
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   404
            # 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
   405
            # these make no sense to reverse.
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   406
            r = scmutil.status(r.modified, r.removed, r.added, [], [], [],
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   407
                               r.clean)
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   408
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   409
        if listsubrepos:
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   410
            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
   411
                try:
27183
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   412
                    rev2 = ctx2.subrev(subpath)
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   413
                except KeyError:
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   414
                    # 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
   415
                    # 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
   416
                    # 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
   417
                    rev2 = None
28017
d3f1b7ee5e70 match: rename "narrowmatcher" to "subdirmatcher" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27983
diff changeset
   418
                submatch = matchmod.subdirmatcher(subpath, match)
27183
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   419
                s = sub.status(rev2, match=submatch, ignored=listignored,
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   420
                               clean=listclean, unknown=listunknown,
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   421
                               listsubrepos=True)
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   422
                for rfiles, sfiles in zip(r, s):
0945539a3a6b extdiff: correctly handle deleted subrepositories (issue3153)
Andrew Zwicky <andrew.zwicky@gmail.com>
parents: 27064
diff changeset
   423
                    rfiles.extend("%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
   424
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   425
        for l in r:
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   426
            l.sort()
21616
0a8e7f81e8ae context: explicitly return a tuple
Sean Farley <sean.michael.farley@gmail.com>
parents: 21595
diff changeset
   427
23301
c10dc5568069 context.status: wipe deleted/unknown/ignored fields when reversed
Martin von Zweigbergk <martinvonz@google.com>
parents: 23257
diff changeset
   428
        return r
21594
9e4567829129 basectx: copy localrepo.status method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21593
diff changeset
   429
32006
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   430
def _filterederror(repo, changeid):
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   431
    """build an exception to be raised about a filtered changeid
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   432
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   433
    This is extracted in a function to help extensions (eg: evolve) to
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   434
    experiment with various message variants."""
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   435
    if repo.filtername.startswith('visible'):
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   436
        msg = _("hidden revision '%s'") % changeid
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   437
        hint = _('use --hidden to access hidden revisions')
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   438
        return error.FilteredRepoLookupError(msg, hint=hint)
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   439
    msg = _("filtered revision '%s' (not in '%s' subset)")
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   440
    msg %= (changeid, repo.filtername)
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   441
    return error.FilteredRepoLookupError(msg)
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   442
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
   443
class changectx(basectx):
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   444
    """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
   445
    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
   446
    the repo."""
6741
5918e2b79859 context: simplify changeid logic
Matt Mackall <mpm@selenic.com>
parents: 6737
diff changeset
   447
    def __init__(self, repo, changeid=''):
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   448
        """changeid is a revision number, node, or tag"""
19539
79671c46bb46 changectx: if passing a basectx then exit __init__ immediately
Sean Farley <sean.michael.farley@gmail.com>
parents: 19538
diff changeset
   449
79671c46bb46 changectx: if passing a basectx then exit __init__ immediately
Sean Farley <sean.michael.farley@gmail.com>
parents: 19538
diff changeset
   450
        # since basectx.__new__ already took care of copying the object, we
79671c46bb46 changectx: if passing a basectx then exit __init__ immediately
Sean Farley <sean.michael.farley@gmail.com>
parents: 19538
diff changeset
   451
        # don't need to do anything in __init__, so we just exit here
79671c46bb46 changectx: if passing a basectx then exit __init__ immediately
Sean Farley <sean.michael.farley@gmail.com>
parents: 19538
diff changeset
   452
        if isinstance(changeid, basectx):
79671c46bb46 changectx: if passing a basectx then exit __init__ immediately
Sean Farley <sean.michael.farley@gmail.com>
parents: 19538
diff changeset
   453
            return
79671c46bb46 changectx: if passing a basectx then exit __init__ immediately
Sean Farley <sean.michael.farley@gmail.com>
parents: 19538
diff changeset
   454
6741
5918e2b79859 context: simplify changeid logic
Matt Mackall <mpm@selenic.com>
parents: 6737
diff changeset
   455
        if changeid == '':
5918e2b79859 context: simplify changeid logic
Matt Mackall <mpm@selenic.com>
parents: 6737
diff changeset
   456
            changeid = '.'
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   457
        self._repo = repo
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   458
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   459
        try:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   460
            if isinstance(changeid, int):
23013
b50ed6b9b513 changectx: move `IndexError` handling in the top level try except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23012
diff changeset
   461
                self._node = repo.changelog.node(changeid)
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   462
                self._rev = changeid
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   463
                return
31352
ff2f90503d64 context: work around `long` not existing on Python 3
Augie Fackler <augie@google.com>
parents: 31318
diff changeset
   464
            if not pycompat.ispy3 and isinstance(changeid, long):
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   465
                changeid = str(changeid)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   466
            if changeid == 'null':
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   467
                self._node = nullid
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   468
                self._rev = nullrev
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   469
                return
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   470
            if changeid == 'tip':
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   471
                self._node = repo.changelog.tip()
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   472
                self._rev = repo.changelog.rev(self._node)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   473
                return
24050
a9b61dbdb827 context: use unfiltered repo for '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 23984
diff changeset
   474
            if changeid == '.' or changeid == repo.dirstate.p1():
a9b61dbdb827 context: use unfiltered repo for '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 23984
diff changeset
   475
                # this is a hack to delay/avoid loading obsmarkers
a9b61dbdb827 context: use unfiltered repo for '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 23984
diff changeset
   476
                # when we know that '.' won't be hidden
a9b61dbdb827 context: use unfiltered repo for '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 23984
diff changeset
   477
                self._node = repo.dirstate.p1()
a9b61dbdb827 context: use unfiltered repo for '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 23984
diff changeset
   478
                self._rev = repo.unfiltered().changelog.rev(self._node)
a9b61dbdb827 context: use unfiltered repo for '.'
Martin von Zweigbergk <martinvonz@google.com>
parents: 23984
diff changeset
   479
                return
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   480
            if len(changeid) == 20:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   481
                try:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   482
                    self._node = changeid
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   483
                    self._rev = repo.changelog.rev(changeid)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   484
                    return
23017
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   485
                except error.FilteredRepoLookupError:
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   486
                    raise
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   487
                except LookupError:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   488
                    pass
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   489
18084
ee3b5fb648c7 clfilter: ensure context raise RepoLookupError when the revision is filtered
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18072
diff changeset
   490
            try:
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   491
                r = int(changeid)
31360
5da0c7888dc4 context: use portable construction to verify int parsing
Augie Fackler <augie@google.com>
parents: 31353
diff changeset
   492
                if '%d' % r != changeid:
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   493
                    raise ValueError
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   494
                l = len(repo.changelog)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   495
                if r < 0:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   496
                    r += l
32680
a722c8e17363 localrepo: map integer and hex wdir identifiers to workingctx
Yuya Nishihara <yuya@tcha.org>
parents: 32674
diff changeset
   497
                if r < 0 or r >= l and r != wdirrev:
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   498
                    raise ValueError
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   499
                self._rev = r
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   500
                self._node = repo.changelog.node(r)
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   501
                return
23017
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   502
            except error.FilteredIndexError:
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   503
                raise
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   504
            except (ValueError, OverflowError, IndexError):
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   505
                pass
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   506
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   507
            if len(changeid) == 40:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   508
                try:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   509
                    self._node = bin(changeid)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   510
                    self._rev = repo.changelog.rev(self._node)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   511
                    return
23017
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   512
                except error.FilteredLookupError:
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   513
                    raise
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   514
                except (TypeError, LookupError):
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   515
                    pass
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   516
23560
aead63705504 changectx: use names api to simplify and extend node lookup
Sean Farley <sean.michael.farley@gmail.com>
parents: 23543
diff changeset
   517
            # lookup bookmarks through the name interface
aead63705504 changectx: use names api to simplify and extend node lookup
Sean Farley <sean.michael.farley@gmail.com>
parents: 23543
diff changeset
   518
            try:
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23560
diff changeset
   519
                self._node = repo.names.singlenode(repo, changeid)
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   520
                self._rev = repo.changelog.rev(self._node)
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   521
                return
23560
aead63705504 changectx: use names api to simplify and extend node lookup
Sean Farley <sean.michael.farley@gmail.com>
parents: 23543
diff changeset
   522
            except KeyError:
aead63705504 changectx: use names api to simplify and extend node lookup
Sean Farley <sean.michael.farley@gmail.com>
parents: 23543
diff changeset
   523
                pass
23017
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   524
            except error.FilteredRepoLookupError:
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   525
                raise
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   526
            except error.RepoLookupError:
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   527
                pass
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   528
23017
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   529
            self._node = repo.unfiltered().changelog._partialmatch(changeid)
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   530
            if self._node is not None:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   531
                self._rev = repo.changelog.rev(self._node)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   532
                return
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   533
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   534
            # lookup failed
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   535
            # check if it might have come from damaged dirstate
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   536
            #
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   537
            # XXX we could avoid the unfiltered if we had a recognizable
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   538
            # exception for filtered changeset access
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   539
            if changeid in repo.unfiltered().dirstate.parents():
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   540
                msg = _("working directory has unknown parent '%s'!")
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   541
                raise error.Abort(msg % short(changeid))
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   542
            try:
26604
a3fcc8e3136b context: don't hex encode all unknown 20 char revision specs (issue4890)
Mads Kiilerich <madski@unity3d.com>
parents: 26587
diff changeset
   543
                if len(changeid) == 20 and nonascii(changeid):
23012
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   544
                    changeid = hex(changeid)
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   545
            except TypeError:
bdb3349cf7ab changectx: wrap the `changeid` processing in a try/except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22942
diff changeset
   546
                pass
23017
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   547
        except (error.FilteredIndexError, error.FilteredLookupError,
dc25ed84bee8 changectx: issue a FilteredRepoLookupError when applicable
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23013
diff changeset
   548
                error.FilteredRepoLookupError):
32006
c84c83b5df0f hidden: extract the code generating "filtered rev" error for wrapping
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31992
diff changeset
   549
            raise _filterederror(repo, changeid)
23013
b50ed6b9b513 changectx: move `IndexError` handling in the top level try except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23012
diff changeset
   550
        except IndexError:
b50ed6b9b513 changectx: move `IndexError` handling in the top level try except
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23012
diff changeset
   551
            pass
16376
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   552
        raise error.RepoLookupError(
d3908c911d5e context: internalize lookup logic
Matt Mackall <mpm@selenic.com>
parents: 16373
diff changeset
   553
            _("unknown revision '%s'") % changeid)
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   554
6469
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   555
    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
   556
        try:
fb502719c75c python 2.6 compatibility: add __hash__ to classes that have __eq__
Paul Moore <p.f.moore@gmail.com>
parents: 6286
diff changeset
   557
            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
   558
        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
   559
            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
   560
3168
05c588e1803d context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents: 3166
diff changeset
   561
    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
   562
        return self._rev != nullrev
3168
05c588e1803d context: add __nonzero__ methods
Matt Mackall <mpm@selenic.com>
parents: 3166
diff changeset
   563
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   564
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   565
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   566
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   567
    def _changeset(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   568
        return self._repo.changelog.changelogrevision(self.rev())
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   569
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   570
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   571
    def _manifest(self):
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   572
        return self._manifestctx.read()
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   573
32552
6ae068f801e3 context: do not cache manifestctx
Jun Wu <quark@fb.com>
parents: 32519
diff changeset
   574
    @property
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   575
    def _manifestctx(self):
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   576
        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
   577
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   578
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   579
    def _manifestdelta(self):
30354
362f6f651b2e context: add manifestctx property on changectx
Durham Goode <durham@fb.com>
parents: 30350
diff changeset
   580
        return self._manifestctx.readdelta()
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   581
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
   582
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
   583
    def _parents(self):
27063
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   584
        repo = self._repo
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   585
        p1, p2 = repo.changelog.parentrevs(self._rev)
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   586
        if p2 == nullrev:
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   587
            return [changectx(repo, p1)]
37e1fdcb271c context: optimize _parents()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27016
diff changeset
   588
        return [changectx(repo, p1), changectx(repo, p2)]
3215
931288cf58a7 contexts: use __getattr__ rather than try/except in changectx
Matt Mackall <mpm@selenic.com>
parents: 3214
diff changeset
   589
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   590
    def changeset(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   591
        c = self._changeset
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   592
        return (
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   593
            c.manifest,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   594
            c.user,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   595
            c.date,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   596
            c.files,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   597
            c.description,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   598
            c.extra,
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   599
        )
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   600
    def manifestnode(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   601
        return self._changeset.manifest
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   602
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   603
    def user(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   604
        return self._changeset.user
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   605
    def date(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   606
        return self._changeset.date
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   607
    def files(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   608
        return self._changeset.files
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   609
    def description(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   610
        return self._changeset.description
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   611
    def branch(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   612
        return encoding.tolocal(self._changeset.extra.get("branch"))
16720
e825a89de5d7 context: add changectx.closesbranch() method
Brodie Rao <brodie@sf.io>
parents: 16719
diff changeset
   613
    def closesbranch(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   614
        return 'close' in self._changeset.extra
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   615
    def extra(self):
28488
437c32dcec7d context: use changelogrevision
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
   616
        return self._changeset.extra
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   617
    def tags(self):
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   618
        return self._repo.nodetags(self._node)
13384
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13235
diff changeset
   619
    def bookmarks(self):
caa561759538 context: add method to return all bookmarks pointing to a node
David Soria Parra <dsp@php.net>
parents: 13235
diff changeset
   620
        return self._repo.nodebookmarks(self._node)
15421
405ca90df2b1 phases: add a phase method to context
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 15337
diff changeset
   621
    def phase(self):
16657
b6081c2c4647 phases: introduce phasecache
Patrick Mezard <patrick@mezard.eu>
parents: 16610
diff changeset
   622
        return self._repo._phasecache.phase(self._repo, self._rev)
14644
f3a40fd7008c hidden: Add ``hidden`` method for context
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14528
diff changeset
   623
    def hidden(self):
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18364
diff changeset
   624
        return self._rev in repoview.filterrevs(self._repo, 'visible')
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   625
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   626
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   627
        return False
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
   628
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   629
    def children(self):
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   630
        """return contexts for each child changeset"""
2627
b779319a532b context.py: self.repo is not defined, change to self._repo
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2566
diff changeset
   631
        c = self._repo.changelog.children(self._node)
3673
eb0b4a2d70a9 white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents: 3578
diff changeset
   632
        return [changectx(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
   633
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   634
    def ancestors(self):
16866
91f3ac205816 revlog: ancestors(*revs) becomes ancestors(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16761
diff changeset
   635
        for a in self._repo.changelog.ancestors([self._rev]):
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   636
            yield changectx(self._repo, a)
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   637
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   638
    def descendants(self):
16867
1093ad1e8903 revlog: descendants(*revs) becomes descendants(revs) (API)
Bryan O'Sullivan <bryano@fb.com>
parents: 16866
diff changeset
   639
        for d in self._repo.changelog.descendants([self._rev]):
6876
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   640
            yield changectx(self._repo, d)
077f1e637cd8 Merge with stable
Matt Mackall <mpm@selenic.com>
parents: 6846
diff changeset
   641
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
   642
    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
   643
        """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
   644
        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
   645
            fileid = self.filenode(path)
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
   646
        return filectx(self._repo, path, fileid=fileid,
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
   647
                       changectx=self, filelog=filelog)
2563
482c524dd9ab Add context.py: changeset and file revision contexts
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   648
21203
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   649
    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
   650
        """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
   651
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
   652
        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
   653
        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
   654
        revlog ancestor."""
9843
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   655
        # deal with workingctxs
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   656
        n2 = c2._node
13031
3da456d0c885 code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents: 13001
diff changeset
   657
        if n2 is None:
9843
d1043c2ffe6c merge: fix changectx.ancestor(workingctx) (issue1327)
Matt Mackall <mpm@selenic.com>
parents: 9751
diff changeset
   658
            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
   659
        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
   660
        if not cahs:
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   661
            anc = nullid
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   662
        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
   663
            anc = cahs[0]
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   664
        else:
25844
18541e9510c5 merge: make merge.preferancestor type and default consistent
Matt Mackall <mpm@selenic.com>
parents: 25757
diff changeset
   665
            # experimental config: merge.preferancestor
34480
99c3dee3f6ce configitems: register the 'merge.preferancestor' config
Boris Feld <boris.feld@octobus.net>
parents: 34434
diff changeset
   666
            for r in self._repo.ui.configlist('merge', 'preferancestor'):
22671
5220c12c43fd changectx: skip all invalid merge.preferancestor values
Mads Kiilerich <madski@unity3d.com>
parents: 22405
diff changeset
   667
                try:
5220c12c43fd changectx: skip all invalid merge.preferancestor values
Mads Kiilerich <madski@unity3d.com>
parents: 22405
diff changeset
   668
                    ctx = changectx(self._repo, r)
5220c12c43fd changectx: skip all invalid merge.preferancestor values
Mads Kiilerich <madski@unity3d.com>
parents: 22405
diff changeset
   669
                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
   670
                    continue
21126
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   671
                anc = ctx.node()
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   672
                if anc in cahs:
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   673
                    break
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   674
            else:
99b5eaf372a7 context: introduce merge.preferancestor for controlling which ancestor to pick
Mads Kiilerich <madski@unity3d.com>
parents: 21125
diff changeset
   675
                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
   676
            if warn:
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   677
                self._repo.ui.status(
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   678
                    (_("note: using %s as ancestor of %s and %s\n") %
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   679
                     (short(anc), short(self._node), short(n2))) +
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   680
                    ''.join(_("      alternatively, use --config "
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   681
                              "merge.preferancestor=%s\n") %
9f12d8665c7b ancestor: silence multiple ancestor warning outside of merge (issue4234)
Matt Mackall <mpm@selenic.com>
parents: 21126
diff changeset
   682
                            short(n) for n in sorted(cahs) if n != anc))
21125
e94e90a4526e context: tell when .ancestor picks one of multiple common ancestors heads
Mads Kiilerich <madski@unity3d.com>
parents: 21114
diff changeset
   683
        return changectx(self._repo, anc)
3125
02b22fefc01f changectx: add ancestor function
Matt Mackall <mpm@selenic.com>
parents: 3124
diff changeset
   684
17626
3a524b647897 context: add "descendant()" to changectx for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17469
diff changeset
   685
    def descendant(self, other):
3a524b647897 context: add "descendant()" to changectx for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17469
diff changeset
   686
        """True if other is descendant of this changeset"""
3a524b647897 context: add "descendant()" to changectx for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17469
diff changeset
   687
        return self._repo.changelog.descendant(self._rev, other._rev)
3a524b647897 context: add "descendant()" to changectx for efficient descendant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 17469
diff changeset
   688
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6763
diff changeset
   689
    def walk(self, match):
24646
5693c834bcb4 manifest: move changectx.walk() to manifests
Drew Gottlieb <drgott@google.com>
parents: 24633
diff changeset
   690
        '''Generates matching file names.'''
20292
8dc254198a8f changectx: increase perf of walk function
Durham Goode <durham@fb.com>
parents: 20236
diff changeset
   691
25435
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   692
        # 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
   693
        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
   694
            # 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
   695
            # paths into valid subrepos.
25195
472a685a4961 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 25122 25193
diff changeset
   696
            if any(fn == s or fn.startswith(s + '/')
472a685a4961 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 25122 25193
diff changeset
   697
                   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
   698
                return
25435
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   699
            match.bad(fn, _('no such file in rev %s') % self)
20292
8dc254198a8f changectx: increase perf of walk function
Durham Goode <durham@fb.com>
parents: 20236
diff changeset
   700
25435
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   701
        m = matchmod.badmatch(match, bad)
a592a6a6f4fe context: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25417
diff changeset
   702
        return self._manifest.walk(m)
6764
8db64464d136 context: add walk method
Matt Mackall <mpm@selenic.com>
parents: 6763
diff changeset
   703
21985
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
   704
    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
   705
        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
   706
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
   707
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
   708
    """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
   709
    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
   710
             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
   711
    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
   712
                    directory,
32283
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
   713
    memfilectx: a filecontext that represents files in-memory,
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
   714
    overlayfilectx: duplicate another filecontext with some fields overridden.
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
   715
    """
19573
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   716
    @propertycache
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   717
    def _filelog(self):
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   718
        return self._repo.file(self._path)
dffad92ab709 basefilectx: move _filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19572
diff changeset
   719
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   720
    @propertycache
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   721
    def _changeid(self):
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
   722
        if r'_changeid' in self.__dict__:
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   723
            return self._changeid
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
   724
        elif r'_changectx' in self.__dict__:
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   725
            return self._changectx.rev()
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
   726
        elif r'_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
   727
            # 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
   728
            # descendant, we can (lazily) correct for linkrev aliases
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   729
            return self._adjustlinkrev(self._descendantrev)
19574
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   730
        else:
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   731
            return self._filelog.linkrev(self._filerev)
a01436798988 basefilectx: move _changeid from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19573
diff changeset
   732
19575
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   733
    @propertycache
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   734
    def _filenode(self):
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
   735
        if r'_fileid' in self.__dict__:
19575
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   736
            return self._filelog.lookup(self._fileid)
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   737
        else:
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   738
            return self._changectx.filenode(self._path)
5a868137b830 basefilectx: move _filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19574
diff changeset
   739
19576
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   740
    @propertycache
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   741
    def _filerev(self):
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   742
        return self._filelog.rev(self._filenode)
18bbd8a3abf3 basefilectx: move _filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19575
diff changeset
   743
19577
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   744
    @propertycache
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   745
    def _repopath(self):
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   746
        return self._path
b52d572a2177 basefilectx: move _repopath from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19576
diff changeset
   747
19578
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   748
    def __nonzero__(self):
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   749
        try:
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   750
            self._filenode
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   751
            return True
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   752
        except error.LookupError:
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   753
            # file is missing
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   754
            return False
2c149635c2c5 basefilectx: move __nonzero__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19577
diff changeset
   755
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   756
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
   757
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
   758
    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
   759
        try:
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   760
            return "%s@%s" % (self.path(), self._changectx)
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   761
        except error.LookupError:
e25ce44f8447 context: make sure __str__ works, also when there is no _changectx
Mads Kiilerich <mads@kiilerich.com>
parents: 30040
diff changeset
   762
            return "%s@???" % self.path()
19579
964844d64ef8 basefilectx: move __str__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19578
diff changeset
   763
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
   764
    __str__ = encoding.strmethod(__bytes__)
33035
daccadd75760 py3: define __bytes__ for basefilectx class
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32922
diff changeset
   765
19580
e86a594ab11f basefilectx: move __repr__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19579
diff changeset
   766
    def __repr__(self):
e86a594ab11f basefilectx: move __repr__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19579
diff changeset
   767
        return "<%s %s>" % (type(self).__name__, str(self))
e86a594ab11f basefilectx: move __repr__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19579
diff changeset
   768
19581
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   769
    def __hash__(self):
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   770
        try:
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   771
            return hash((self._path, self._filenode))
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   772
        except AttributeError:
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   773
            return id(self)
fe50d21be01a basefilectx: move __hash__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19580
diff changeset
   774
19582
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   775
    def __eq__(self, other):
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   776
        try:
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   777
            return (type(self) == type(other) and self._path == other._path
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   778
                    and self._filenode == other._filenode)
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   779
        except AttributeError:
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   780
            return False
bda1d48bb07f basefilectx: move __eq__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19581
diff changeset
   781
19583
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   782
    def __ne__(self, other):
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   783
        return not (self == other)
e5074d82afc9 basefilectx: move __ne__ from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19582
diff changeset
   784
19584
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   785
    def filerev(self):
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   786
        return self._filerev
19585
8e553cd6071e basefilectx: move filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19584
diff changeset
   787
    def filenode(self):
8e553cd6071e basefilectx: move filenode from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19584
diff changeset
   788
        return self._filenode
32278
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   789
    @propertycache
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   790
    def _flags(self):
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   791
        return self._changectx.flags(self._path)
19586
43f9ed2f64b1 basefilectx: move flags from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19585
diff changeset
   792
    def flags(self):
32278
8a660af9dbe3 filectx: make flags a property cache
Jun Wu <quark@fb.com>
parents: 32197
diff changeset
   793
        return self._flags
19587
b1c344ebd8e4 basefilectx: move filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19586
diff changeset
   794
    def filelog(self):
b1c344ebd8e4 basefilectx: move filelog from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19586
diff changeset
   795
        return self._filelog
19588
a192fff6c97d basefilectx: move rev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19587
diff changeset
   796
    def rev(self):
a192fff6c97d basefilectx: move rev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19587
diff changeset
   797
        return self._changeid
19589
6a9043fa06d0 basefilectx: move linkrev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19588
diff changeset
   798
    def linkrev(self):
6a9043fa06d0 basefilectx: move linkrev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19588
diff changeset
   799
        return self._filelog.linkrev(self._filerev)
19590
90994b176bc1 basefilectx: move node from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19589
diff changeset
   800
    def node(self):
90994b176bc1 basefilectx: move node from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19589
diff changeset
   801
        return self._changectx.node()
19591
04fbc85f870a basefilectx: move hex from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19590
diff changeset
   802
    def hex(self):
04fbc85f870a basefilectx: move hex from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19590
diff changeset
   803
        return self._changectx.hex()
19592
1cdb3b3df4df basefilectx: move user from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19591
diff changeset
   804
    def user(self):
1cdb3b3df4df basefilectx: move user from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19591
diff changeset
   805
        return self._changectx.user()
19593
e3c241c89350 basefilectx: move date from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19592
diff changeset
   806
    def date(self):
e3c241c89350 basefilectx: move date from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19592
diff changeset
   807
        return self._changectx.date()
19594
1c030c24e196 basefilectx: move files from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19593
diff changeset
   808
    def files(self):
1c030c24e196 basefilectx: move files from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19593
diff changeset
   809
        return self._changectx.files()
19595
bb6fd06975a6 basefilectx: move description from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19594
diff changeset
   810
    def description(self):
bb6fd06975a6 basefilectx: move description from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19594
diff changeset
   811
        return self._changectx.description()
19596
9bc3d0dea371 basefilectx: move branch from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19595
diff changeset
   812
    def branch(self):
9bc3d0dea371 basefilectx: move branch from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19595
diff changeset
   813
        return self._changectx.branch()
19597
837bc86370f0 basefilectx: move extra from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19596
diff changeset
   814
    def extra(self):
837bc86370f0 basefilectx: move extra from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19596
diff changeset
   815
        return self._changectx.extra()
19598
e8ef893a3150 basefilectx: move phase from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19597
diff changeset
   816
    def phase(self):
e8ef893a3150 basefilectx: move phase from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19597
diff changeset
   817
        return self._changectx.phase()
19599
66d83efac20a basefilectx: move phasestr from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19598
diff changeset
   818
    def phasestr(self):
66d83efac20a basefilectx: move phasestr from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19598
diff changeset
   819
        return self._changectx.phasestr()
19600
12cdff44fdc4 basefilectx: move manifest from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19599
diff changeset
   820
    def manifest(self):
12cdff44fdc4 basefilectx: move manifest from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19599
diff changeset
   821
        return self._changectx.manifest()
19601
f284907631f5 basefilectx: move changectx from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19600
diff changeset
   822
    def changectx(self):
f284907631f5 basefilectx: move changectx from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19600
diff changeset
   823
        return self._changectx
32279
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
   824
    def renamed(self):
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
   825
        return self._copied
24333
5da0eb641881 filectx: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24326
diff changeset
   826
    def repo(self):
5da0eb641881 filectx: add a repo accessor
Matt Harbison <matt_harbison@yahoo.com>
parents: 24326
diff changeset
   827
        return self._repo
32280
842ea95d45dc filectx: move size to basefilectx
Jun Wu <quark@fb.com>
parents: 32279
diff changeset
   828
    def size(self):
842ea95d45dc filectx: move size to basefilectx
Jun Wu <quark@fb.com>
parents: 32279
diff changeset
   829
        return len(self.data())
19584
fe300e63c28c basefilectx: move filerev from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19583
diff changeset
   830
19602
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   831
    def path(self):
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   832
        return self._path
018ee491a6be basefilectx: move path from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19601
diff changeset
   833
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   834
    def isbinary(self):
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   835
        try:
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   836
            return util.binary(self.data())
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   837
        except IOError:
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   838
            return False
22054
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   839
    def isexec(self):
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   840
        return 'x' in self.flags()
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   841
    def islink(self):
ef0ee0c001bf basefilectx: move isexec and islink from memfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21992
diff changeset
   842
        return 'l' in self.flags()
19603
a92302f48a56 basefilectx: move isbinary from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19602
diff changeset
   843
26978
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   844
    def isabsent(self):
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   845
        """whether this filectx represents a file not in self._changectx
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   846
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   847
        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
   848
        expected to be True for all subclasses of basectx."""
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   849
        return False
9b9d4bcc915e filectx: add isabsent method
Siddharth Agarwal <sid0@fb.com>
parents: 26977
diff changeset
   850
26977
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   851
    _customcmp = False
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   852
    def cmp(self, fctx):
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   853
        """compare with other file context
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   854
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   855
        returns True if different than fctx.
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   856
        """
26977
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   857
        if fctx._customcmp:
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   858
            return fctx.cmp(self)
bd19561b98d9 filectx: allow custom comparators
Siddharth Agarwal <sid0@fb.com>
parents: 26748
diff changeset
   859
28116
ba8257cb53e8 filectx: replace use of _filerev with _filenode
Durham Goode <durham@fb.com>
parents: 28017
diff changeset
   860
        if (fctx._filenode is None
19604
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   861
            and (self._repo._encodefilterpats
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   862
                 # if file data starts with '\1\n', empty metadata block is
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   863
                 # prepended, which adds 4 bytes to filelog.size().
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   864
                 or self.size() - 4 == fctx.size())
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   865
            or self.size() == fctx.size()):
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   866
            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
   867
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   868
        return True
ef7c47e4002f basefilectx: move cmp from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19603
diff changeset
   869
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   870
    def _adjustlinkrev(self, srcrev, inclusive=False):
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24050
diff changeset
   871
        """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
   872
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   873
        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
   874
        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
   875
        this file revision.
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   876
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   877
        :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
   878
        :inclusive: if true, the src revision will also be checked
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   879
        """
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   880
        repo = self._repo
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   881
        cl = repo.unfiltered().changelog
29943
80be4436e4cc manifest: adds manifestctx.readfast
Durham Goode <durham@fb.com>
parents: 29942
diff changeset
   882
        mfl = repo.manifestlog
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   883
        # fetch the linkrev
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   884
        lkr = self.linkrev()
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
   885
        # 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
   886
        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
   887
        iteranc = None
24411
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   888
        if srcrev is None:
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   889
            # 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
   890
            revs = [p.rev() for p in self._repo[None].parents()]
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   891
            inclusive = True # we skipped the real (revless) source
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   892
        else:
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   893
            revs = [srcrev]
23980
c1ce5442453f _adjustlinkrev: reuse ancestors set during rename detection (issue4514)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23979
diff changeset
   894
        if memberanc is None:
24411
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   895
            memberanc = iteranc = cl.ancestors(revs, lkr,
5a12ef618c03 adjustlinkrev: handle 'None' value as source
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24410
diff changeset
   896
                                               inclusive=inclusive)
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   897
        # 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
   898
        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
   899
            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
   900
                iteranc = cl.ancestors(revs, lkr, inclusive=inclusive)
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   901
            fnode = self._filenode
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   902
            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
   903
            for a in iteranc:
23979
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   904
                ac = cl.read(a) # get changeset data (we avoid object creation)
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   905
                if path in ac[3]: # checking the 'files' field.
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   906
                    # 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
   907
                    # similar to the one we search for.
29943
80be4436e4cc manifest: adds manifestctx.readfast
Durham Goode <durham@fb.com>
parents: 29942
diff changeset
   908
                    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
   909
                        return a
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   910
            # 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
   911
            # 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
   912
            # 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
   913
            # 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
   914
        return lkr
087603b50889 filectx: move _adjustlinkrev to a method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23865
diff changeset
   915
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   916
    def introrev(self):
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   917
        """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
   918
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   919
        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
   920
        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
   921
        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
   922
        '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
   923
        changesets.
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   924
        """
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   925
        lkr = self.linkrev()
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   926
        attrs = vars(self)
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   927
        noctx = not ('_changeid' in attrs or '_changectx' in attrs)
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   928
        if noctx or self.rev() == lkr:
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   929
            return self.linkrev()
30289
e81d72b4b0ae adjustlinkrev: remove unnecessary parameters
Jun Wu <quark@fb.com>
parents: 30284
diff changeset
   930
        return self._adjustlinkrev(self.rev(), inclusive=True)
23703
aaa76612b3c0 linkrev: introduce an 'introrev' method on filectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23702
diff changeset
   931
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   932
    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
   933
        """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
   934
        fctx = filectx(self._repo, path, fileid=fileid, filelog=filelog)
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   935
        if '_changeid' in vars(self) or '_changectx' in vars(self):
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   936
            # 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
   937
            # 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
   938
            # 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
   939
            # 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
   940
            fctx._descendantrev = self.rev()
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   941
            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
   942
        elif '_descendantrev' in vars(self):
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   943
            # 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
   944
            fctx._descendantrev = self._descendantrev
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   945
            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
   946
        return fctx
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   947
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
   948
    def parents(self):
22201
269688a398c4 cleanup: fix some list comprehension redefinitions of existing vars
Mads Kiilerich <madski@unity3d.com>
parents: 22192
diff changeset
   949
        _path = self._path
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
   950
        fl = self._filelog
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
   951
        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
   952
        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
   953
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
   954
        r = fl.renamed(self._filenode)
19605
cf7322cb1c13 basefilectx: move parents from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19604
diff changeset
   955
        if r:
23688
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
   956
            # - 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
   957
            # - 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
   958
            # 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
   959
            # the first one.
20932983d520 filectx.parents: filter nullrev parent sooner
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23687
diff changeset
   960
            #
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24050
diff changeset
   961
            # 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
   962
            # 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
   963
            # 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
   964
            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
   965
24816
8eec040cb65e filectx: extract function to create parent fctx keeping ancestry info
Yuya Nishihara <yuya@tcha.org>
parents: 24815
diff changeset
   966
        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
   967
19606
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
   968
    def p1(self):
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
   969
        return self.parents()[0]
284f91230c07 basefilectx: move p1 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19605
diff changeset
   970
19607
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
   971
    def p2(self):
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
   972
        p = self.parents()
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
   973
        if len(p) == 2:
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
   974
            return p[1]
056a949799ac basefilectx: move p2 from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19606
diff changeset
   975
        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
   976
32519
1df80eff24cf annotate: add a new experimental --skip option to skip revs
Siddharth Agarwal <sid0@fb.com>
parents: 32518
diff changeset
   977
    def annotate(self, follow=False, linenumber=False, skiprevs=None,
1df80eff24cf annotate: add a new experimental --skip option to skip revs
Siddharth Agarwal <sid0@fb.com>
parents: 32518
diff changeset
   978
                 diffopts=None):
29527
576ff900fcc7 context: eliminate handling of linenumber being None in annotate
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29223
diff changeset
   979
        '''returns a list of tuples of ((ctx, number), line) for each line
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
   980
        in the file, where ctx is the filectx of the node where
29527
576ff900fcc7 context: eliminate handling of linenumber being None in annotate
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29223
diff changeset
   981
        that line was last changed; if linenumber parameter is true, number is
576ff900fcc7 context: eliminate handling of linenumber being None in annotate
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29223
diff changeset
   982
        the line number at the first appearance in the managed file, otherwise,
576ff900fcc7 context: eliminate handling of linenumber being None in annotate
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29223
diff changeset
   983
        number has a fixed value of False.
576ff900fcc7 context: eliminate handling of linenumber being None in annotate
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29223
diff changeset
   984
        '''
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
   985
29223
c04ad3d3c651 annotate: optimize line counting
Matt Mackall <mpm@selenic.com>
parents: 29021
diff changeset
   986
        def lines(text):
c04ad3d3c651 annotate: optimize line counting
Matt Mackall <mpm@selenic.com>
parents: 29021
diff changeset
   987
            if text.endswith("\n"):
c04ad3d3c651 annotate: optimize line counting
Matt Mackall <mpm@selenic.com>
parents: 29021
diff changeset
   988
                return text.count("\n")
30040
3e3f2201bbdf annotate: calculate line count correctly
Jun Wu <quark@fb.com>
parents: 30025
diff changeset
   989
            return text.count("\n") + int(bool(text))
29223
c04ad3d3c651 annotate: optimize line counting
Matt Mackall <mpm@selenic.com>
parents: 29021
diff changeset
   990
29527
576ff900fcc7 context: eliminate handling of linenumber being None in annotate
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29223
diff changeset
   991
        if linenumber:
22192
d1823cdf8554 annotate: inline definition of decorate() functions
Yuya Nishihara <yuya@tcha.org>
parents: 22191
diff changeset
   992
            def decorate(text, rev):
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
   993
                return ([annotateline(fctx=rev, lineno=i)
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
   994
                         for i in xrange(1, lines(text) + 1)], text)
22191
9f9a2b79dcd7 annotate: rewrite long short-circuit statement by if-elif-else
Yuya Nishihara <yuya@tcha.org>
parents: 22075
diff changeset
   995
        else:
22192
d1823cdf8554 annotate: inline definition of decorate() functions
Yuya Nishihara <yuya@tcha.org>
parents: 22191
diff changeset
   996
            def decorate(text, rev):
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
   997
                return ([annotateline(fctx=rev)] * lines(text), text)
4856
e45c5120ca27 Allow filectx.annotate to return the line number of first appearance.
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 4748
diff changeset
   998
9097
431462bd8478 fix memory usage of revlog caches by limiting cache size [issue1639]
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   999
        getlog = util.lrucachefunc(lambda x: self._repo.file(x))
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1000
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1001
        def parents(f):
24862
c82d88dfaf59 annotate: always adjust linkrev before walking down to parents (issue4623)
Yuya Nishihara <yuya@tcha.org>
parents: 24818
diff changeset
  1002
            # 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
  1003
            # 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
  1004
            # 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
  1005
            # 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
  1006
            f._changeid
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1007
            pl = f.parents()
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1008
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1009
            # 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
  1010
            if not follow:
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1011
                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
  1012
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1013
            # 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
  1014
            # from the cache to save time
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1015
            for p in pl:
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1016
                if not '_filelog' in p.__dict__:
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1017
                    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
  1018
19292
e0aa6fff8f02 annotate: simplify annotate parent function
Durham Goode <durham@fb.com>
parents: 19288
diff changeset
  1019
            return pl
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1020
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1021
        # use linkrev to find the first changeset where self appeared
23705
28a302e9225d linkrev: also adjust linkrev when bootstrapping annotate (issue4305)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23703
diff changeset
  1022
        base = self
28a302e9225d linkrev: also adjust linkrev when bootstrapping annotate (issue4305)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23703
diff changeset
  1023
        introrev = self.introrev()
28a302e9225d linkrev: also adjust linkrev when bootstrapping annotate (issue4305)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23703
diff changeset
  1024
        if self.rev() != introrev:
23770
50f0096a7346 filectx: fix annotate to not directly instantiate filectx
Durham Goode <durham@fb.com>
parents: 23757
diff changeset
  1025
            base = self.filectx(self.filenode(), changeid=introrev)
24818
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1026
        if getattr(base, '_ancestrycontext', None) is None:
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1027
            cl = self._repo.changelog
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1028
            if introrev is None:
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1029
                # wctx is not inclusive, but works because _ancestrycontext
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1030
                # is used to test filelog revisions
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1031
                ac = cl.ancestors([p.rev() for p in base.parents()],
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1032
                                  inclusive=True)
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1033
            else:
8d7d0bf62f9f annotate: prepare ancestry context of workingfilectx
Yuya Nishihara <yuya@tcha.org>
parents: 24817
diff changeset
  1034
                ac = cl.ancestors([introrev], inclusive=True)
24407
dd01834a696f annotate: reuse ancestry context when adjusting linkrev (issue4532)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23984
diff changeset
  1035
            base._ancestrycontext = ac
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1036
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1037
        # This algorithm would prefer to be recursive, but Python is a
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1038
        # bit recursion-hostile. Instead we do an iterative
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1039
        # depth-first search.
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1040
29667
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1041
        # 1st DFS pre-calculates pcache and needed
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1042
        visit = [base]
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1043
        pcache = {}
3404
1a437b0f4902 Fix annotate where linkrev != rev without exporting linkrev
Brendan Cully <brendan@kublai.com>
parents: 3403
diff changeset
  1044
        needed = {base: 1}
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1045
        while visit:
29667
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1046
            f = visit.pop()
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1047
            if f in pcache:
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1048
                continue
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1049
            pl = parents(f)
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1050
            pcache[f] = pl
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1051
            for p in pl:
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1052
                needed[p] = needed.get(p, 0) + 1
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1053
                if p not in pcache:
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1054
                    visit.append(p)
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1055
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1056
        # 2nd DFS does the actual annotate
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1057
        visit[:] = [base]
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1058
        hist = {}
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1059
        while visit:
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1060
            f = visit[-1]
29667
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1061
            if f in hist:
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1062
                visit.pop()
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1063
                continue
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1064
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1065
            ready = True
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1066
            pl = pcache[f]
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1067
            for p in pl:
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1068
                if p not in hist:
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1069
                    ready = False
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1070
                    visit.append(p)
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1071
            if ready:
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1072
                visit.pop()
29667
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1073
                curr = decorate(f.data(), f)
32519
1df80eff24cf annotate: add a new experimental --skip option to skip revs
Siddharth Agarwal <sid0@fb.com>
parents: 32518
diff changeset
  1074
                skipchild = False
1df80eff24cf annotate: add a new experimental --skip option to skip revs
Siddharth Agarwal <sid0@fb.com>
parents: 32518
diff changeset
  1075
                if skiprevs is not None:
1df80eff24cf annotate: add a new experimental --skip option to skip revs
Siddharth Agarwal <sid0@fb.com>
parents: 32518
diff changeset
  1076
                    skipchild = f._changeid in skiprevs
1df80eff24cf annotate: add a new experimental --skip option to skip revs
Siddharth Agarwal <sid0@fb.com>
parents: 32518
diff changeset
  1077
                curr = _annotatepair([hist[p] for p in pl], f, curr, skipchild,
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1078
                                     diffopts)
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1079
                for p in pl:
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1080
                    if needed[p] == 1:
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1081
                        del hist[p]
19061
36067f5baf24 annotate: discard refcount of discarded annotation for memory efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18993
diff changeset
  1082
                        del needed[p]
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1083
                    else:
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1084
                        needed[p] -= 1
6762
f67d1468ac50 util: add sort helper
Matt Mackall <mpm@selenic.com>
parents: 6760
diff changeset
  1085
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1086
                hist[f] = curr
29667
2f6d5c60f6fc annotate: pre-calculate the "needed" dictionary (issue5360)
Jun Wu <quark@fb.com>
parents: 29527
diff changeset
  1087
                del pcache[f]
3172
5c93dd0ae413 Refactor annotate copy support.
Brendan Cully <brendan@kublai.com>
parents: 3152
diff changeset
  1088
13552
7ab85fec60c3 ancestor: rewrite to deal with crossed linkrevs (issue2682)
Matt Mackall <mpm@selenic.com>
parents: 13481
diff changeset
  1089
        return zip(hist[base][0], hist[base][1].splitlines(True))
3124
4d021b91cb26 filectx: allow passing filelog in init to avoid opening new filelogs
Matt Mackall <mpm@selenic.com>
parents: 3123
diff changeset
  1090
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1091
    def ancestors(self, followfirst=False):
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1092
        visit = {}
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1093
        c = self
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1094
        if followfirst:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1095
            cut = 1
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1096
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1097
            cut = None
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24300
diff changeset
  1098
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1099
        while True:
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1100
            for parent in c.parents()[:cut]:
23981
24b57c3899f8 filectx: use linkrev to sort ancestors
Matt Mackall <mpm@selenic.com>
parents: 23980
diff changeset
  1101
                visit[(parent.linkrev(), parent.filenode())] = parent
19610
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1102
            if not visit:
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1103
                break
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1104
            c = visit.pop(max(visit))
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1105
            yield c
0670422d58c6 basefilectx: move ancestors from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19609
diff changeset
  1106
33919
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1107
    def decodeddata(self):
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1108
        """Returns `data()` after running repository decoding filters.
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1109
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1110
        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
  1111
        """
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1112
        return self._repo.wwritedata(self.path(), self.data())
f488223a87ab context: add `decodeddata()` to basefilectx
Phil Cohen <phillco@fb.com>
parents: 33818
diff changeset
  1113
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1114
@attr.s(slots=True, frozen=True)
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1115
class annotateline(object):
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1116
    fctx = attr.ib()
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1117
    lineno = attr.ib(default=False)
34434
2f5a135b2b04 annotate: track whether a particular annotation was the result of a skip
Siddharth Agarwal <sid0@fb.com>
parents: 34433
diff changeset
  1118
    # Whether this annotation was the result of a skip-annotate.
2f5a135b2b04 annotate: track whether a particular annotation was the result of a skip
Siddharth Agarwal <sid0@fb.com>
parents: 34433
diff changeset
  1119
    skip = attr.ib(default=False)
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1120
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1121
def _annotatepair(parents, childfctx, child, skipchild, diffopts):
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1122
    r'''
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1123
    Given parent and child fctxes and annotate data for parents, for all lines
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1124
    in either parent that match the child, annotate the child with the parent's
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1125
    data.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1126
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1127
    Additionally, if `skipchild` is True, replace all other lines with parent
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1128
    annotate data as well such that child is never blamed for any lines.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1129
34431
80215865d154 annotate: move annotatepair unit tests to a separate file
Siddharth Agarwal <sid0@fb.com>
parents: 34351
diff changeset
  1130
    See test-annotate.py for unit tests.
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1131
    '''
32517
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1132
    pblocks = [(parent, mdiff.allblocks(parent[1], child[1], opts=diffopts))
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1133
               for parent in parents]
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1134
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1135
    if skipchild:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1136
        # Need to iterate over the blocks twice -- make it a list
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1137
        pblocks = [(p, list(blocks)) for (p, blocks) in pblocks]
32517
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1138
    # Mercurial currently prefers p2 over p1 for annotate.
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1139
    # TODO: change this?
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1140
    for parent, blocks in pblocks:
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1141
        for (a1, a2, b1, b2), t in blocks:
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1142
            # Changed blocks ('!') or blocks made only of blank lines ('~')
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1143
            # belong to the child.
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1144
            if t == '=':
c50f29b37aab annotate: make pair take all parents to pair against
Siddharth Agarwal <sid0@fb.com>
parents: 32516
diff changeset
  1145
                child[0][b1:b2] = parent[0][a1:a2]
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1146
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1147
    if skipchild:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1148
        # Now try and match up anything that couldn't be matched,
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1149
        # Reversing pblocks maintains bias towards p2, matching above
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1150
        # behavior.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1151
        pblocks.reverse()
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1152
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1153
        # The heuristics are:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1154
        # * Work on blocks of changed lines (effectively diff hunks with -U0).
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1155
        # This could potentially be smarter but works well enough.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1156
        # * For a non-matching section, do a best-effort fit. Match lines in
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1157
        #   diff hunks 1:1, dropping lines as necessary.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1158
        # * Repeat the last line as a last resort.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1159
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1160
        # First, replace as much as possible without repeating the last line.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1161
        remaining = [(parent, []) for parent, _blocks in pblocks]
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1162
        for idx, (parent, blocks) in enumerate(pblocks):
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1163
            for (a1, a2, b1, b2), _t in blocks:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1164
                if a2 - a1 >= b2 - b1:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1165
                    for bk in xrange(b1, b2):
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1166
                        if child[0][bk].fctx == childfctx:
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1167
                            ak = min(a1 + (bk - b1), a2 - 1)
34434
2f5a135b2b04 annotate: track whether a particular annotation was the result of a skip
Siddharth Agarwal <sid0@fb.com>
parents: 34433
diff changeset
  1168
                            child[0][bk] = attr.evolve(parent[0][ak], skip=True)
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1169
                else:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1170
                    remaining[idx][1].append((a1, a2, b1, b2))
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1171
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1172
        # Then, look at anything left, which might involve repeating the last
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1173
        # line.
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1174
        for parent, blocks in remaining:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1175
            for a1, a2, b1, b2 in blocks:
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1176
                for bk in xrange(b1, b2):
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34432
diff changeset
  1177
                    if child[0][bk].fctx == childfctx:
32518
05abc47f3746 annotate: add core algorithm to skip a rev
Siddharth Agarwal <sid0@fb.com>
parents: 32517
diff changeset
  1178
                        ak = min(a1 + (bk - b1), a2 - 1)
34434
2f5a135b2b04 annotate: track whether a particular annotation was the result of a skip
Siddharth Agarwal <sid0@fb.com>
parents: 34433
diff changeset
  1179
                        child[0][bk] = attr.evolve(parent[0][ak], skip=True)
32516
f8fb8a441b4a annotate: move pair function to top level
Siddharth Agarwal <sid0@fb.com>
parents: 32447
diff changeset
  1180
    return child
f8fb8a441b4a annotate: move pair function to top level
Siddharth Agarwal <sid0@fb.com>
parents: 32447
diff changeset
  1181
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1182
class filectx(basefilectx):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1183
    """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
  1184
       filerevision convenient."""
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1185
    def __init__(self, repo, path, changeid=None, fileid=None,
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1186
                 filelog=None, changectx=None):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1187
        """changeid can be a changeset revision, node, or tag.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1188
           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
  1189
        self._repo = repo
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1190
        self._path = path
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1191
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1192
        assert (changeid is not None
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1193
                or fileid is not None
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1194
                or changectx is not None), \
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1195
                ("bad args: changeid=%r, fileid=%r, changectx=%r"
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1196
                 % (changeid, fileid, changectx))
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1197
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1198
        if filelog is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1199
            self._filelog = filelog
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1200
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1201
        if changeid is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1202
            self._changeid = changeid
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1203
        if changectx is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1204
            self._changectx = changectx
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1205
        if fileid is not None:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1206
            self._fileid = fileid
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1207
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1208
    @propertycache
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1209
    def _changectx(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1210
        try:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1211
            return changectx(self._repo, self._changeid)
23687
8f32dcfbc338 context: catch FilteredRepoLookupError instead of RepoLookupError
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23616
diff changeset
  1212
        except error.FilteredRepoLookupError:
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1213
            # 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
  1214
            # 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
  1215
            # `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
  1216
            # 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
  1217
            # 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
  1218
            # `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
  1219
            # filtering.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1220
            #
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1221
            # 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
  1222
            # 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
  1223
            # 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
  1224
            # behavior" is seen as better as "crash"
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1225
            #
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1226
            # 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
  1227
            # 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
  1228
            # considered when solving linkrev issue are on the table.
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1229
            return changectx(self._repo.unfiltered(), self._changeid)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1230
23770
50f0096a7346 filectx: fix annotate to not directly instantiate filectx
Durham Goode <durham@fb.com>
parents: 23757
diff changeset
  1231
    def filectx(self, fileid, changeid=None):
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1232
        '''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
  1233
        opening a new filelog'''
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1234
        return filectx(self._repo, self._path, fileid=fileid,
23770
50f0096a7346 filectx: fix annotate to not directly instantiate filectx
Durham Goode <durham@fb.com>
parents: 23757
diff changeset
  1235
                       filelog=self._filelog, changeid=changeid)
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1236
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30718
diff changeset
  1237
    def rawdata(self):
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30718
diff changeset
  1238
        return self._filelog.revision(self._filenode, raw=True)
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30718
diff changeset
  1239
32281
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1240
    def rawflags(self):
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1241
        """low-level revlog flags"""
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1242
        return self._filelog.flags(self._filerev)
651ee1681964 filectx: add a rawflags method
Jun Wu <quark@fb.com>
parents: 32280
diff changeset
  1243
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1244
    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
  1245
        try:
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1246
            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
  1247
        except error.CensoredNodeError:
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33364
diff changeset
  1248
            if self._repo.ui.config("censor", "policy") == "ignore":
22932
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1249
                return ""
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26492
diff changeset
  1250
            raise error.Abort(_("censored node: %s") % short(self._filenode),
23110
692bde7f486d i18n: make hint message of exception translatable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23085
diff changeset
  1251
                             hint=_("set censor.policy to ignore errors"))
22932
d81792872984 context: handle censored data in an on-disk file context based on config
Mike Edgar <adgar@google.com>
parents: 22916
diff changeset
  1252
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1253
    def size(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1254
        return self._filelog.size(self._filerev)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1255
32279
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
  1256
    @propertycache
c38c15d4ce48 filectx: make renamed a property cache
Jun Wu <quark@fb.com>
parents: 32278
diff changeset
  1257
    def _copied(self):
19608
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1258
        """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
  1259
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1260
        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
  1261
        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
  1262
        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
  1263
        """
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1264
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1265
        renamed = self._filelog.renamed(self._filenode)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1266
        if not renamed:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1267
            return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1268
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1269
        if self.rev() == self.linkrev():
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1270
            return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1271
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1272
        name = self.path()
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1273
        fnode = self._filenode
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1274
        for p in self._changectx.parents():
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1275
            try:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1276
                if fnode == p.filenode(name):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1277
                    return None
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1278
            except error.LookupError:
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1279
                pass
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1280
        return renamed
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1281
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1282
    def children(self):
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1283
        # hard for renames
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1284
        c = self._filelog.children(self._filenode)
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1285
        return [filectx(self._repo, self._path, fileid=x,
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1286
                        filelog=self._filelog) for x in c]
896193a9cab4 basefilectx: move annotate from filectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19607
diff changeset
  1287
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1288
class committablectx(basectx):
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1289
    """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
  1290
    wants the ability to commit, e.g. workingctx or memctx."""
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
  1291
    def __init__(self, repo, text="", user=None, date=None, extra=None,
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
  1292
                 changes=None):
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1293
        self._repo = repo
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1294
        self._rev = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1295
        self._node = None
6709
f84f507c53d3 context: let workingctx.date(), .user() and description() be overriden
Patrick Mezard <pmezard@gmail.com>
parents: 6708
diff changeset
  1296
        self._text = text
6718
4386a7706828 Fix commit date (issue1193)
Christian Ebert <blacktrash@gmx.net>
parents: 6715
diff changeset
  1297
        if date:
6709
f84f507c53d3 context: let workingctx.date(), .user() and description() be overriden
Patrick Mezard <pmezard@gmail.com>
parents: 6708
diff changeset
  1298
            self._date = util.parsedate(date)
6817
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6809
diff changeset
  1299
        if user:
cf319797d61c minor status fixups
Matt Mackall <mpm@selenic.com>
parents: 6809
diff changeset
  1300
            self._user = user
6707
02bad34230a2 localrepo: hide commit() file selection behind workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6705
diff changeset
  1301
        if changes:
21592
16f62b4203b1 committablectx: simplify caching the status
Sean Farley <sean.michael.farley@gmail.com>
parents: 21590
diff changeset
  1302
            self._status = changes
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1303
6708
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1304
        self._extra = {}
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1305
        if extra:
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1306
            self._extra = extra.copy()
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1307
        if 'branch' not in self._extra:
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1308
            try:
13047
6c375e07d673 branch: operate on branch names in local string space where possible
Matt Mackall <mpm@selenic.com>
parents: 13031
diff changeset
  1309
                branch = encoding.fromlocal(self._repo.dirstate.branch())
6708
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1310
            except UnicodeDecodeError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26492
diff changeset
  1311
                raise error.Abort(_('branch name not in UTF-8!'))
6708
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1312
            self._extra['branch'] = branch
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1313
        if self._extra['branch'] == '':
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1314
            self._extra['branch'] = 'default'
7566f00a3979 localrepo: let commit() get extra data from workingctx
Patrick Mezard <pmezard@gmail.com>
parents: 6707
diff changeset
  1315
32666
1df98fc923d4 py3: implement __bytes__ for committablectx
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32636
diff changeset
  1316
    def __bytes__(self):
1df98fc923d4 py3: implement __bytes__ for committablectx
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32636
diff changeset
  1317
        return bytes(self._parents[0]) + "+"
19666
09459edfb48b commitablectx: move __str__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19665
diff changeset
  1318
33038
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
  1319
    __str__ = encoding.strmethod(__bytes__)
ce96efec8112 py3: add utility to forward __str__() to __bytes__()
Yuya Nishihara <yuya@tcha.org>
parents: 33035
diff changeset
  1320
19667
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1321
    def __nonzero__(self):
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1322
        return True
40040e4015f9 commitablectx: move __nonzero__ from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19666
diff changeset
  1323
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  1324
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  1325
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1326
    def _buildflagfunc(self):
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1327
        # Create a fallback function for getting file flags when the
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1328
        # filesystem doesn't support them
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1329
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1330
        copiesget = self._repo.dirstate.copies().get
27064
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
  1331
        parents = self.parents()
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
  1332
        if len(parents) < 2:
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1333
            # when we have one parent, it's easy: copy from parent
27064
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
  1334
            man = parents[0].manifest()
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1335
            def func(f):
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1336
                f = copiesget(f, f)
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1337
                return man.flags(f)
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1338
        else:
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1339
            # merges are tricky: we try to reconstruct the unstored
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1340
            # result from the merge (issue1802)
27064
a29db426c5ba context: avoid extra parents lookups
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27063
diff changeset
  1341
            p1, p2 = parents
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1342
            pa = p1.ancestor(p2)
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1343
            m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1344
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1345
            def func(f):
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1346
                f = copiesget(f, f) # may be wrong for merges with copies
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1347
                fl1, fl2, fla = m1.flags(f), m2.flags(f), ma.flags(f)
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1348
                if fl1 == fl2:
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1349
                    return fl1
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1350
                if fl1 == fla:
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1351
                    return fl2
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1352
                if fl2 == fla:
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1353
                    return fl1
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1354
                return '' # punt for conflicts
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1355
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1356
        return func
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1357
19670
6ac735fbea50 commitablectx: move _flagfunc from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19669
diff changeset
  1358
    @propertycache
6ac735fbea50 commitablectx: move _flagfunc from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19669
diff changeset
  1359
    def _flagfunc(self):
6ac735fbea50 commitablectx: move _flagfunc from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19669
diff changeset
  1360
        return self._repo.dirstate.flagfunc(self._buildflagfunc)
6ac735fbea50 commitablectx: move _flagfunc from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19669
diff changeset
  1361
15337
cf5f9df6406b windows: recompute flags when committing a merge (issue1802)
Matt Mackall <mpm@selenic.com>
parents: 14674
diff changeset
  1362
    @propertycache
19672
375986c02539 commitablectx: move _status from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19671
diff changeset
  1363
    def _status(self):
21592
16f62b4203b1 committablectx: simplify caching the status
Sean Farley <sean.michael.farley@gmail.com>
parents: 21590
diff changeset
  1364
        return self._repo.status()
19672
375986c02539 commitablectx: move _status from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19671
diff changeset
  1365
19674
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1366
    @propertycache
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1367
    def _user(self):
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1368
        return self._repo.ui.username()
ec5b2e2b947f commitablectx: move _user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19673
diff changeset
  1369
19676
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1370
    @propertycache
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1371
    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
  1372
        ui = self._repo.ui
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1373
        date = ui.configdate('devel', 'default-date')
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1374
        if date is None:
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1375
            date = util.makedate()
3e2e179ef031 devel: add a config field to force dates to timestamp 0
Boris Feld <boris.feld@octobus.net>
parents: 32439
diff changeset
  1376
        return date
19676
103525f36337 commitablectx: move _date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19675
diff changeset
  1377
21587
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1378
    def subrev(self, subpath):
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1379
        return None
02a8612ddec2 committablectx: add subrev method to return None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21586
diff changeset
  1380
24719
11e8fec00234 committablectx: override manifestnode() to return None
Yuya Nishihara <yuya@tcha.org>
parents: 24646
diff changeset
  1381
    def manifestnode(self):
11e8fec00234 committablectx: override manifestnode() to return None
Yuya Nishihara <yuya@tcha.org>
parents: 24646
diff changeset
  1382
        return None
19675
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1383
    def user(self):
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1384
        return self._user or self._repo.ui.username()
19677
e11415510352 commitablectx: move date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19676
diff changeset
  1385
    def date(self):
e11415510352 commitablectx: move date from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19676
diff changeset
  1386
        return self._date
19678
897c2dbc0256 commitablectx: move description from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19677
diff changeset
  1387
    def description(self):
897c2dbc0256 commitablectx: move description from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19677
diff changeset
  1388
        return self._text
19679
f21804f1582e commitablectx: move files from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19678
diff changeset
  1389
    def files(self):
22916
cfa8d7561938 context: store status class instead of plain tuple in self._status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1390
        return sorted(self._status.modified + self._status.added +
cfa8d7561938 context: store status class instead of plain tuple in self._status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1391
                      self._status.removed)
19675
84249d49f37c commitablectx: move user from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19674
diff changeset
  1392
19680
fc33fcfa08f2 commitablectx: move modified from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19679
diff changeset
  1393
    def modified(self):
22916
cfa8d7561938 context: store status class instead of plain tuple in self._status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1394
        return self._status.modified
19681
cfc4ae65023f commitablectx: move added from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19680
diff changeset
  1395
    def added(self):
22916
cfa8d7561938 context: store status class instead of plain tuple in self._status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1396
        return self._status.added
19682
42ffc7f31acf commitablectx: move removed from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19681
diff changeset
  1397
    def removed(self):
22916
cfa8d7561938 context: store status class instead of plain tuple in self._status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1398
        return self._status.removed
19683
6336f35ed77d commitablectx: move deleted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19682
diff changeset
  1399
    def deleted(self):
22916
cfa8d7561938 context: store status class instead of plain tuple in self._status
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22914
diff changeset
  1400
        return self._status.deleted
19687
54b3b4821bfb commitablectx: move branch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19686
diff changeset
  1401
    def branch(self):
54b3b4821bfb commitablectx: move branch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19686
diff changeset
  1402
        return encoding.tolocal(self._extra['branch'])
19688
21e1068109a7 commitablectx: move closesbranch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19687
diff changeset
  1403
    def closesbranch(self):
21e1068109a7 commitablectx: move closesbranch from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19687
diff changeset
  1404
        return 'close' in self._extra
19689
8dbb66f339f3 commitablectx: move extra from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19688
diff changeset
  1405
    def extra(self):
8dbb66f339f3 commitablectx: move extra from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19688
diff changeset
  1406
        return self._extra
19680
fc33fcfa08f2 commitablectx: move modified from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19679
diff changeset
  1407
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1408
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1409
        return False
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1410
19690
65ff9fd67d8d commitablectx: move tags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19689
diff changeset
  1411
    def tags(self):
25688
24cda1dd45ff workingctx: don't report the tags for its parents
Matt Harbison <matt_harbison@yahoo.com>
parents: 25660
diff changeset
  1412
        return []
19690
65ff9fd67d8d commitablectx: move tags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19689
diff changeset
  1413
19691
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1414
    def bookmarks(self):
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1415
        b = []
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1416
        for p in self.parents():
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1417
            b.extend(p.bookmarks())
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1418
        return b
33ae2052d924 commitablectx: move bookmarks from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19690
diff changeset
  1419
19692
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1420
    def phase(self):
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1421
        phase = phases.draft # default phase to draft
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1422
        for p in self.parents():
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1423
            phase = max(phase, p.phase())
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1424
        return phase
594f4d2b0ce9 commitablectx: move phase from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19691
diff changeset
  1425
19693
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1426
    def hidden(self):
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1427
        return False
56ba14d4bc02 commitablectx: move hidden from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19692
diff changeset
  1428
19694
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1429
    def children(self):
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1430
        return []
ba4c01c34df9 commitablectx: move children from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19693
diff changeset
  1431
19695
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1432
    def flags(self, path):
32197
2cfdf5241096 py3: use raw strings while accessing class.__dict__
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32069
diff changeset
  1433
        if r'_manifest' in self.__dict__:
19695
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1434
            try:
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1435
                return self._manifest.flags(path)
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1436
            except KeyError:
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1437
                return ''
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1438
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1439
        try:
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1440
            return self._flagfunc(path)
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1441
        except OSError:
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1442
            return ''
6c52adcaba0e commitablectx: move flags from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19694
diff changeset
  1443
19696
210cc42a8ac2 commitablectx: move ancestor from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19695
diff changeset
  1444
    def ancestor(self, c2):
22389
94f77624dbb5 comments: describe ancestor consistently - avoid 'least common ancestor'
Mads Kiilerich <madski@unity3d.com>
parents: 22313
diff changeset
  1445
        """return the "best" ancestor context of self and c2"""
19696
210cc42a8ac2 commitablectx: move ancestor from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19695
diff changeset
  1446
        return self._parents[0].ancestor(c2) # punt on two parents for now
210cc42a8ac2 commitablectx: move ancestor from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19695
diff changeset
  1447
19697
8c95e74857c6 commitablectx: move walk from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19696
diff changeset
  1448
    def walk(self, match):
24646
5693c834bcb4 manifest: move changectx.walk() to manifests
Drew Gottlieb <drgott@google.com>
parents: 24633
diff changeset
  1449
        '''Generates matching file names.'''
34350
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34146
diff changeset
  1450
        return sorted(self._repo.dirstate.walk(match,
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34146
diff changeset
  1451
                                               subrepos=sorted(self.substate),
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34146
diff changeset
  1452
                                               unknown=True, ignored=False))
19697
8c95e74857c6 commitablectx: move walk from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19696
diff changeset
  1453
21985
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
  1454
    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
  1455
        return sorted(self._repo.dirstate.matches(match))
7e871e771300 context: add a method to efficiently filter by match if possible
Siddharth Agarwal <sid0@fb.com>
parents: 21973
diff changeset
  1456
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1457
    def ancestors(self):
23616
11a160547d7f context: return dirstate parents in workingctx.ancestors()
Durham Goode <durham@fb.com>
parents: 23603
diff changeset
  1458
        for p in self._parents:
11a160547d7f context: return dirstate parents in workingctx.ancestors()
Durham Goode <durham@fb.com>
parents: 23603
diff changeset
  1459
            yield p
19698
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1460
        for a in self._repo.changelog.ancestors(
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1461
            [p.rev() for p in self._parents]):
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1462
            yield changectx(self._repo, a)
8d4a8f4eb404 commitablectx: move ancestors from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19697
diff changeset
  1463
19699
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1464
    def markcommitted(self, node):
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1465
        """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
  1466
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1467
        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
  1468
        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
  1469
        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
  1470
        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
  1471
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1472
        """
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1473
32388
81936f6462c1 context: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32283
diff changeset
  1474
        with self._repo.dirstate.parentchange():
81936f6462c1 context: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32283
diff changeset
  1475
            for f in self.modified() + self.added():
81936f6462c1 context: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32283
diff changeset
  1476
                self._repo.dirstate.normal(f)
81936f6462c1 context: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32283
diff changeset
  1477
            for f in self.removed():
81936f6462c1 context: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32283
diff changeset
  1478
                self._repo.dirstate.drop(f)
81936f6462c1 context: migrate to context manager for changing dirstate parents
Augie Fackler <augie@google.com>
parents: 32283
diff changeset
  1479
            self._repo.dirstate.setparents(node)
19699
9fbc193b2358 commitablectx: move markcommitted from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19698
diff changeset
  1480
25757
4d1382fd96ff context: write dirstate out explicitly at the end of markcommitted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25753
diff changeset
  1481
        # write changes out explicitly, because nesting wlock at
4d1382fd96ff context: write dirstate out explicitly at the end of markcommitted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25753
diff changeset
  1482
        # runtime may prevent 'wlock.release()' in 'repo.commit()'
4d1382fd96ff context: write dirstate out explicitly at the end of markcommitted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25753
diff changeset
  1483
        # from immediately doing so for subsequent changing files
26748
5ba0a99ff27f dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26604
diff changeset
  1484
        self._repo.dirstate.write(self._repo.currenttransaction())
25757
4d1382fd96ff context: write dirstate out explicitly at the end of markcommitted
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25753
diff changeset
  1485
32633
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32632
diff changeset
  1486
    def dirty(self, missing=False, merge=True, branch=True):
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32632
diff changeset
  1487
        return False
bf728e72a219 context: move dirty() to committablectx
Sean Farley <sean@farley.io>
parents: 32632
diff changeset
  1488
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1489
class workingctx(committablectx):
19671
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1490
    """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
  1491
    the current working directory convenient.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1492
    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
  1493
    user - username string, or None.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1494
    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
  1495
    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
  1496
               or None to use the repository status.
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1497
    """
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1498
    def __init__(self, repo, text="", user=None, date=None, extra=None,
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1499
                 changes=None):
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1500
        super(workingctx, self).__init__(repo, text, user, date, extra, changes)
367e95bba6e8 commitablectx: move _manifest from workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19670
diff changeset
  1501
14129
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1502
    def __iter__(self):
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1503
        d = self._repo.dirstate
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1504
        for f in d:
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1505
            if d[f] != 'r':
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1506
                yield f
81e6d42b3228 context: provide an efficient iterator for workingctx
Matt Mackall <mpm@selenic.com>
parents: 14004
diff changeset
  1507
21845
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1508
    def __contains__(self, key):
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1509
        return self._repo.dirstate[key] not in "?r"
04f5b5e3792e committablectx: move __contains__ into workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21844
diff changeset
  1510
25590
183965a00c76 context: override workingctx.hex() to avoid a crash
Matt Harbison <matt_harbison@yahoo.com>
parents: 25465
diff changeset
  1511
    def hex(self):
25738
04d26a3c96fd workingctx: use node.wdirid constant
Yuya Nishihara <yuya@tcha.org>
parents: 25688
diff changeset
  1512
        return hex(wdirid)
25590
183965a00c76 context: override workingctx.hex() to avoid a crash
Matt Harbison <matt_harbison@yahoo.com>
parents: 25465
diff changeset
  1513
8157
77c5877a668c context: use Python 2.4 decorator syntax
Martin Geisler <mg@lazybytes.net>
parents: 8151
diff changeset
  1514
    @propertycache
7368
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1515
    def _parents(self):
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1516
        p = self._repo.dirstate.parents()
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1517
        if p[1] == nullid:
595ba2537d4f context: use descriptors to speed up lazy attributes
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7367
diff changeset
  1518
            p = p[:-1]
17330
32e9d63d9ba6 context: simplify workingctx._parents
Patrick Mezard <patrick@mezard.eu>
parents: 17207
diff changeset
  1519
        return [changectx(self._repo, x) for x in p]
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1520
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
  1521
    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
  1522
        """get a file context from the working directory"""
3966
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
  1523
        return workingfilectx(self._repo, path, workingctx=self,
b4eaa68dea1b context: create a filectxt with filelog reuse
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3965
diff changeset
  1524
                              filelog=filelog)
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1525
16491
bfe89d65d651 update: make --check abort with dirty subrepos
Patrick Mezard <patrick@mezard.eu>
parents: 16410
diff changeset
  1526
    def dirty(self, missing=False, merge=True, branch=True):
8717
e8de59577257 context: add a dirty method to detect modified contexts
Matt Mackall <mpm@selenic.com>
parents: 8528
diff changeset
  1527
        "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
  1528
        # check subrepos first
18364
6252b4f1c4b4 subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 18252
diff changeset
  1529
        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
  1530
            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
  1531
                return True
22f5ad0b5857 subrepo: dirtiness checks should iterate over subrepos
Edouard Gomez <ed.gomez@free.fr>
parents: 11106
diff changeset
  1532
        # check current working dir
16491
bfe89d65d651 update: make --check abort with dirty subrepos
Patrick Mezard <patrick@mezard.eu>
parents: 16410
diff changeset
  1533
        return ((merge and self.p2()) or
bfe89d65d651 update: make --check abort with dirty subrepos
Patrick Mezard <patrick@mezard.eu>
parents: 16410
diff changeset
  1534
                (branch and self.branch() != self.p1().branch()) or
8717
e8de59577257 context: add a dirty method to detect modified contexts
Matt Mackall <mpm@selenic.com>
parents: 8528
diff changeset
  1535
                self.modified() or self.added() or self.removed() or
e8de59577257 context: add a dirty method to detect modified contexts
Matt Mackall <mpm@selenic.com>
parents: 8528
diff changeset
  1536
                (missing and self.deleted()))
e8de59577257 context: add a dirty method to detect modified contexts
Matt Mackall <mpm@selenic.com>
parents: 8528
diff changeset
  1537
12270
166b9866580a add: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 12070
diff changeset
  1538
    def add(self, list, prefix=""):
27809
37a75d69eb43 with: use context manager for wlock in workingctx.add
Bryan O'Sullivan <bryano@fb.com>
parents: 27749
diff changeset
  1539
        with self._repo.wlock():
37a75d69eb43 with: use context manager for wlock in workingctx.add
Bryan O'Sullivan <bryano@fb.com>
parents: 27749
diff changeset
  1540
            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
  1541
            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
  1542
            rejected = []
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1543
            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
  1544
            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
  1545
                # 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
  1546
                # 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
  1547
                # 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
  1548
                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
  1549
                try:
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1550
                    st = lstat(f)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13962
diff changeset
  1551
                except OSError:
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1552
                    ui.warn(_("%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
  1553
                    rejected.append(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1554
                    continue
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1555
                if st.st_size > 10000000:
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1556
                    ui.warn(_("%s: up to %d MB of RAM may be required "
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1557
                              "to manage this file\n"
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1558
                              "(use 'hg revert %s' to cancel the "
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1559
                              "pending addition)\n")
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1560
                            % (f, 3 * st.st_size // 1000000, uipath(f)))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1561
                if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1562
                    ui.warn(_("%s not added: only files and symlinks "
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1563
                              "supported currently\n") % uipath(f))
19900
7c21e3398931 context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19734
diff changeset
  1564
                    rejected.append(f)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1565
                elif ds[f] in 'amn':
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1566
                    ui.warn(_("%s already tracked!\n") % uipath(f))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1567
                elif ds[f] == 'r':
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1568
                    ds.normallookup(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1569
                else:
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1570
                    ds.add(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1571
            return rejected
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1572
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15895
diff changeset
  1573
    def forget(self, files, prefix=""):
27810
8c81975fe145 with: use context manager for wlock in workingctx.forget
Bryan O'Sullivan <bryano@fb.com>
parents: 27809
diff changeset
  1574
        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
  1575
            ds = self._repo.dirstate
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1576
            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
  1577
            rejected = []
14435
5f6090e559fa context: make forget work like commands.forget
Matt Mackall <mpm@selenic.com>
parents: 14434
diff changeset
  1578
            for f in files:
16111
131d1a09108a context: make workingctx.forget() really warn about untracked files
Patrick Mezard <patrick@mezard.eu>
parents: 15912
diff changeset
  1579
                if f not in self._repo.dirstate:
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1580
                    self._repo.ui.warn(_("%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
  1581
                    rejected.append(f)
16111
131d1a09108a context: make workingctx.forget() really warn about untracked files
Patrick Mezard <patrick@mezard.eu>
parents: 15912
diff changeset
  1582
                elif self._repo.dirstate[f] != 'a':
131d1a09108a context: make workingctx.forget() really warn about untracked files
Patrick Mezard <patrick@mezard.eu>
parents: 15912
diff changeset
  1583
                    self._repo.dirstate.remove(f)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1584
                else:
14434
cc8c09855d19 dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents: 14429
diff changeset
  1585
                    self._repo.dirstate.drop(f)
15912
2bd54ffaa27e forget: fix subrepo recursion for explicit path handling
David M. Carr <david@carrclan.us>
parents: 15895
diff changeset
  1586
            return rejected
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1587
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1588
    def undelete(self, list):
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1589
        pctxs = self.parents()
27811
09820fb88e14 with: use context manager for wlock in workingctx.undelete
Bryan O'Sullivan <bryano@fb.com>
parents: 27810
diff changeset
  1590
        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
  1591
            ds = self._repo.dirstate
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1592
            for f in list:
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1593
                if self._repo.dirstate[f] != 'r':
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1594
                    self._repo.ui.warn(_("%s not removed!\n") % ds.pathto(f))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1595
                else:
12360
4ae3e5dffa60 context: fix filectx.undelete() (issue2388)
Patrick Mezard <pmezard@gmail.com>
parents: 12344
diff changeset
  1596
                    fctx = f in pctxs[0] and pctxs[0][f] or pctxs[1][f]
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1597
                    t = fctx.data()
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1598
                    self._repo.wwrite(f, t, fctx.flags())
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1599
                    self._repo.dirstate.normal(f)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1600
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1601
    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
  1602
        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
  1603
            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
  1604
        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
  1605
            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
  1606
                raise
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1607
            self._repo.ui.warn(_("%s does not exist!\n")
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1608
                               % self._repo.dirstate.pathto(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
  1609
            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
  1610
        if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1611
            self._repo.ui.warn(_("copy failed: %s is not a file or a "
33501
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1612
                                 "symbolic link\n")
7008f6819002 context: name files relative to cwd in warning messages
Matt Harbison <matt_harbison@yahoo.com>
parents: 33499
diff changeset
  1613
                               % self._repo.dirstate.pathto(dest))
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1614
        else:
27812
28d0c0ef327b with: use context manager for wlock in copy
Bryan O'Sullivan <bryano@fb.com>
parents: 27811
diff changeset
  1615
            with self._repo.wlock():
23402
2963d5c9d90b rename: properly report removed and added file as modified (issue4458)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23401
diff changeset
  1616
                if self._repo.dirstate[dest] in '?':
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1617
                    self._repo.dirstate.add(dest)
23402
2963d5c9d90b rename: properly report removed and added file as modified (issue4458)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23401
diff changeset
  1618
                elif self._repo.dirstate[dest] in 'r':
2963d5c9d90b rename: properly report removed and added file as modified (issue4458)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23401
diff changeset
  1619
                    self._repo.dirstate.normallookup(dest)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1620
                self._repo.dirstate.copy(source, dest)
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11151
diff changeset
  1621
31397
9e57033fec0c context: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31360
diff changeset
  1622
    def match(self, pats=None, include=None, exclude=None, default='glob',
25465
f472228a9e5e context: add an optional constructor parameter for a match.bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25435
diff changeset
  1623
              listsubrepos=False, badfn=None):
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1624
        r = self._repo
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1625
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1626
        # 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
  1627
        # 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
  1628
        icasefs = not util.fscasesensitive(r.root)
284b18303f61 match: replace icasefsmatch() function by flag to regular match()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32433
diff changeset
  1629
        return matchmod.match(r.root, r.getcwd(), pats, include, exclude,
284b18303f61 match: replace icasefsmatch() function by flag to regular match()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32433
diff changeset
  1630
                              default, auditor=r.auditor, ctx=self,
284b18303f61 match: replace icasefsmatch() function by flag to regular match()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32433
diff changeset
  1631
                              listsubrepos=listsubrepos, badfn=badfn,
284b18303f61 match: replace icasefsmatch() function by flag to regular match()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32433
diff changeset
  1632
                              icasefs=icasefs)
24790
baa11dde8c0e match: add a subclass for dirstate normalizing of the matched patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 24776
diff changeset
  1633
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1634
    def flushall(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1635
        pass # For overlayworkingfilectx compatibility.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1636
21393
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1637
    def _filtersuspectsymlink(self, files):
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1638
        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
  1639
            return files
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1640
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1641
        # 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
  1642
        # 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
  1643
        # 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
  1644
        # symlink
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1645
        sane = []
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1646
        for f in files:
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1647
            if self.flags(f) == 'l':
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1648
                d = self[f].data()
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1649
                if d == '' or len(d) >= 1024 or '\n' in d or util.binary(d):
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1650
                    self._repo.ui.debug('ignoring suspect symlink placeholder'
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1651
                                        ' "%s"\n' % f)
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1652
                    continue
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1653
            sane.append(f)
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1654
        return sane
a45af4da0421 localrepo: move symlink logic to workingctx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21238
diff changeset
  1655
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1656
    def _checklookup(self, files):
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1657
        # 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
  1658
        if not files:
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1659
            return [], [], []
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1660
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1661
        modified = []
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1662
        deleted = []
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1663
        fixup = []
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1664
        pctx = self._parents[0]
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1665
        # 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
  1666
        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
  1667
            try:
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1668
                # 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
  1669
                # directory in the interim, but fixing that is pretty hard.
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1670
                if (f not in pctx or self.flags(f) != pctx.flags(f)
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1671
                    or pctx[f].cmp(self[f])):
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1672
                    modified.append(f)
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1673
                else:
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1674
                    fixup.append(f)
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1675
            except (IOError, OSError):
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1676
                # 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
  1677
                # matching dirstate behavior (issue5584).
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1678
                # 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
  1679
                # 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
  1680
                # 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
  1681
                # it's in the dirstate.
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1682
                deleted.append(f)
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1683
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1684
        return modified, deleted, fixup
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1685
32832
6d73b7ff8f92 workingctx: also pass status tuple into poststatusfixup
Siddharth Agarwal <sid0@fb.com>
parents: 32831
diff changeset
  1686
    def _poststatusfixup(self, status, fixup):
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1687
        """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
  1688
        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
  1689
        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
  1690
            try:
32772
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1691
                oldid = self._repo.dirstate.identity()
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1692
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1693
                # 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
  1694
                # 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
  1695
                # 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
  1696
                # taking the lock
27813
ff20fe74e5c6 with: use context manager for wlock in checklookup
Bryan O'Sullivan <bryano@fb.com>
parents: 27812
diff changeset
  1697
                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
  1698
                    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
  1699
                        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
  1700
                            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
  1701
                            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
  1702
                                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
  1703
                            # 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
  1704
                            # 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
  1705
                            # 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
  1706
                            # 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
  1707
                            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
  1708
                            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
  1709
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1710
                        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
  1711
                            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
  1712
                                ps(self, status)
32772
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1713
                    else:
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1714
                        # 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
  1715
                        # consistency, because .hg/dirstate was
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1716
                        # already changed simultaneously after last
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1717
                        # caching (see also issue5584 for detail)
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1718
                        self._repo.ui.debug('skip updating dirstate: '
dc7efa2826e4 context: avoid writing outdated dirstate out (issue5584)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32748
diff changeset
  1719
                                            'identity mismatch\n')
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1720
            except error.LockError:
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1721
                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
  1722
            finally:
2083d1643d69 workingctx: add a way for extensions to run code at status fixup time
Siddharth Agarwal <sid0@fb.com>
parents: 32832
diff changeset
  1723
                # 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
  1724
                self._repo.clearpostdsstatus()
21395
f251b92d9ed9 localrepo: factor out parentworking logic for comparing files
Sean Farley <sean.michael.farley@gmail.com>
parents: 21393
diff changeset
  1725
33955
e43264525ce5 context: remove unnecessary default values for matchers (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33954
diff changeset
  1726
    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
  1727
        '''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
  1728
        subrepos = []
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1729
        if '.hgsub' in self:
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1730
            subrepos = sorted(self.substate)
34351
ac0cd81e2f83 dirstate: use keyword arguments to clarify status()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34350
diff changeset
  1731
        cmp, s = self._repo.dirstate.status(match, subrepos, ignored=ignored,
ac0cd81e2f83 dirstate: use keyword arguments to clarify status()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34350
diff changeset
  1732
                                            clean=clean, unknown=unknown)
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1733
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1734
        # check for any possibly clean files
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1735
        fixup = []
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1736
        if cmp:
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1737
            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
  1738
            s.modified.extend(modified2)
32141
c850f0ed54c1 status: don't crash if a lookup file disappears
Siddharth Agarwal <sid0@fb.com>
parents: 32069
diff changeset
  1739
            s.deleted.extend(deleted2)
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1740
34351
ac0cd81e2f83 dirstate: use keyword arguments to clarify status()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34350
diff changeset
  1741
            if fixup and clean:
23303
3f269bd4826c context.status: avoid de- and reconstructing status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23302
diff changeset
  1742
                s.clean.extend(fixup)
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1743
32832
6d73b7ff8f92 workingctx: also pass status tuple into poststatusfixup
Siddharth Agarwal <sid0@fb.com>
parents: 32831
diff changeset
  1744
        self._poststatusfixup(s, fixup)
32831
add613cddcb6 workingctx: factor out post-status dirstate fixup
Siddharth Agarwal <sid0@fb.com>
parents: 32801
diff changeset
  1745
23776
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1746
        if match.always():
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1747
            # cache for performance
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1748
            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
  1749
                # "_status" is cached with list*=False in the normal route
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1750
                self._status = scmutil.status(s.modified, s.added, s.removed,
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1751
                                              s.deleted, [], [], [])
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1752
            else:
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1753
                self._status = s
70bf92b87410 status: cache dirstate status in _dirstatestatus()
Martin von Zweigbergk <martinvonz@google.com>
parents: 23770
diff changeset
  1754
23303
3f269bd4826c context.status: avoid de- and reconstructing status tuple
Martin von Zweigbergk <martinvonz@google.com>
parents: 23302
diff changeset
  1755
        return s
21397
38743c59f3f8 context: add private _dirstatestatus method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21396
diff changeset
  1756
31269
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1757
    @propertycache
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1758
    def _manifest(self):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1759
        """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
  1760
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1761
        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
  1762
        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
  1763
        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
  1764
        deleting newly added files.
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1765
        """
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1766
        return self._buildstatusmanifest(self._status)
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1767
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1768
    def _buildstatusmanifest(self, status):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1769
        """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
  1770
        parents = self.parents()
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1771
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1772
        man = parents[0].manifest().copy()
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1773
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1774
        ff = self._flagfunc
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1775
        for i, l in ((addednodeid, status.added),
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1776
                     (modifiednodeid, status.modified)):
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1777
            for f in l:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1778
                man[f] = i
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1779
                try:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1780
                    man.setflag(f, ff(f))
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1781
                except OSError:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1782
                    pass
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1783
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1784
        for f in status.deleted + status.removed:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1785
            if f in man:
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1786
                del man[f]
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1787
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1788
        return man
6a9d0d24fdb4 context: move _manifest from committablectx to workingctx
Durham Goode <durham@fb.com>
parents: 31268
diff changeset
  1789
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1790
    def _buildstatus(self, other, s, match, listignored, listclean,
21663
8d9449eaaeff context: fix wrong indentation from renaming method
Sean Farley <sean.michael.farley@gmail.com>
parents: 21616
diff changeset
  1791
                     listunknown):
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1792
        """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
  1793
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1794
        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
  1795
        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
  1796
        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
  1797
        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
  1798
        """
23239
9fbb50444d55 context.status: call _dirstatestatus() from within _buildstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23238
diff changeset
  1799
        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
  1800
        # 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
  1801
        # 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
  1802
        # 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
  1803
        s.modified[:] = self._filtersuspectsymlink(s.modified)
21480
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1804
        if other != self._repo['.']:
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1805
            s = super(workingctx, self)._buildstatus(other, s, match,
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1806
                                                     listignored, listclean,
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1807
                                                     listunknown)
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1808
        return s
d19f491e5d5b workingctx: use inheritance for _buildstatus while keeping the fastpath
Sean Farley <sean.michael.farley@gmail.com>
parents: 21477
diff changeset
  1809
23237
98f41a2f8fba context.status: remove unused arguments from _matchstatus()
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 23236
diff changeset
  1810
    def _matchstatus(self, other, match):
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1811
        """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
  1812
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1813
        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
  1814
        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
  1815
        comparing against the parent changeset.
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1816
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1817
        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
  1818
        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
  1819
        """
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1820
        if other != self._repo['.']:
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1821
            def bad(f, msg):
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1822
                # '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
  1823
                # 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
  1824
                if f not in other and not other.hasdir(f):
21482
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1825
                    self._repo.ui.warn('%s: %s\n' %
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1826
                                       (self._repo.dirstate.pathto(f), msg))
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1827
            match.bad = bad
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1828
        return match
869a28d016e9 workingctx: override _matchstatus for parentworking case
Sean Farley <sean.michael.farley@gmail.com>
parents: 21481
diff changeset
  1829
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  1830
    def markcommitted(self, node):
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  1831
        super(workingctx, self).markcommitted(node)
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  1832
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  1833
        sparse.aftercommit(self._repo, node)
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33283
diff changeset
  1834
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1835
class committablefilectx(basefilectx):
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1836
    """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
  1837
    that wants the ability to commit, e.g. workingfilectx or memfilectx."""
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
  1838
    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
  1839
        self._repo = repo
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1840
        self._path = path
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1841
        self._changeid = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1842
        self._filerev = self._filenode = None
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1843
19149
921b64e1f7b9 filecontext: use 'is not None' to check for filelog existence
Durham Goode <durham@fb.com>
parents: 19061
diff changeset
  1844
        if filelog is not None:
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1845
            self._filelog = filelog
19702
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  1846
        if ctx:
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  1847
            self._changectx = ctx
d25fdd4c2fd1 commitablefilectx: move __init__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19701
diff changeset
  1848
19703
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  1849
    def __nonzero__(self):
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  1850
        return True
d2936bec530b commitablefilectx: move __nonzero__ from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19702
diff changeset
  1851
31483
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  1852
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31473
diff changeset
  1853
24420
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  1854
    def linkrev(self):
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  1855
        # 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
  1856
        return self.rev()
065b886f61c6 committablefilectx: override linkrev() to point to the associated changectx
Yuya Nishihara <yuya@tcha.org>
parents: 24415
diff changeset
  1857
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1858
    def parents(self):
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1859
        '''return parent filectxs, following copies if necessary'''
8528
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1860
        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
  1861
            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
  1862
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1863
        path = self._path
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1864
        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
  1865
        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
  1866
        renamed = self.renamed()
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1867
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1868
        if renamed:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1869
            pl = [renamed + (None,)]
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1870
        else:
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1871
            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
  1872
4ddffb793d18 workingfilectx: always use the same filelog, even for renames
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8527
diff changeset
  1873
        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
  1874
            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
  1875
24817
0bb98eee531d committablefilectx: propagate ancestry info to parent to fix annotation
Yuya Nishihara <yuya@tcha.org>
parents: 24816
diff changeset
  1876
        return [self._parentfilectx(p, fileid=n, filelog=l)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1877
                for p, n, l in pl if n != nullid]
3217
6d98149d70fe contexts: add working dir and working file contexts
Matt Mackall <mpm@selenic.com>
parents: 3216
diff changeset
  1878
19705
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  1879
    def children(self):
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  1880
        return []
79792c8ea6da commitablefilectx: move children from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19704
diff changeset
  1881
19733
51988f008df3 context: use correct spelling of committable
Sean Farley <sean.michael.farley@gmail.com>
parents: 19705
diff changeset
  1882
class workingfilectx(committablefilectx):
19704
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1883
    """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
  1884
       file in the working directory convenient."""
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1885
    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
  1886
        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
  1887
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1888
    @propertycache
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1889
    def _changectx(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1890
        return workingctx(self._repo)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1891
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1892
    def data(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1893
        return self._repo.wread(self._path)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1894
    def renamed(self):
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1895
        rp = self._repo.dirstate.copied(self._path)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1896
        if not rp:
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1897
            return None
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1898
        return rp, self._changectx._parents[0]._manifest.get(rp, nullid)
bad0bd99ac96 commitablefilectx: move parents from workingfilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 19703
diff changeset
  1899
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1900
    def size(self):
19901
4d3ce1646dfc context: use "vfs.lstat()" instead of "os.lstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
  1901
        return self._repo.wvfs.lstat(self._path).st_size
3962
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  1902
    def date(self):
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  1903
        t, tz = self._changectx.date()
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  1904
        try:
27016
448cbdab5883 util: drop statmtimesec
Matt Mackall <mpm@selenic.com>
parents: 26978
diff changeset
  1905
            return (self._repo.wvfs.lstat(self._path).st_mtime, tz)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25600
diff changeset
  1906
        except OSError as err:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1907
            if err.errno != errno.ENOENT:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1908
                raise
3962
2b8825c94c5a add date attribute to workingfilectx
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3961
diff changeset
  1909
            return (t, tz)
3310
0e370798eebf context: add cmp for filectxs
Matt Mackall <mpm@selenic.com>
parents: 3302
diff changeset
  1910
33283
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  1911
    def exists(self):
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  1912
        return self._repo.wvfs.exists(self._path)
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  1913
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  1914
    def lexists(self):
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  1915
        return self._repo.wvfs.lexists(self._path)
634b259079c5 workingfilectx: add exists, lexists
Phil Cohen <phillco@fb.com>
parents: 33098
diff changeset
  1916
33098
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  1917
    def audit(self):
eb4c49f55f1f workingfilectx: add audit() as a wrapper for wvfs.audit()
Phil Cohen <phillco@fb.com>
parents: 33097
diff changeset
  1918
        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
  1919
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  1920
    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
  1921
        """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
  1922
11702
eb07fbc21e9c filectx: use cmp(self, fctx) instead of cmp(self, text)
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 11605
diff changeset
  1923
        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
  1924
        """
17425
e95ec38f86b0 fix wording and not-completely-trivial spelling errors and bad docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
  1925
        # 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
  1926
        # 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
  1927
        return fctx.cmp(self)
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  1928
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  1929
    def remove(self, ignoremissing=False):
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  1930
        """wraps unlink for a repo's working directory"""
31318
8908f985570c vfs: use repo.wvfs.unlinkpath
Mads Kiilerich <madski@unity3d.com>
parents: 31271
diff changeset
  1931
        self._repo.wvfs.unlinkpath(self._path, ignoremissing=ignoremissing)
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  1932
33097
1e79c66d6b07 workingfilectx: add backgroundclose as a kwarg to write()
Phil Cohen <phillco@fb.com>
parents: 33096
diff changeset
  1933
    def write(self, data, flags, backgroundclose=False):
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  1934
        """wraps repo.wwrite"""
33097
1e79c66d6b07 workingfilectx: add backgroundclose as a kwarg to write()
Phil Cohen <phillco@fb.com>
parents: 33096
diff changeset
  1935
        self._repo.wwrite(self._path, data, flags,
1e79c66d6b07 workingfilectx: add backgroundclose as a kwarg to write()
Phil Cohen <phillco@fb.com>
parents: 33096
diff changeset
  1936
                          backgroundclose=backgroundclose)
22073
0c48bc3d0eb2 workingfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22072
diff changeset
  1937
34787
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  1938
    def markcopied(self, src):
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  1939
        """marks this file a copy of `src`"""
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  1940
        if self._repo.dirstate[self._path] in "nma":
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  1941
            self._repo.dirstate.copy(src, self._path)
754b5117622f context: add workingfilectx.markcopied
Phil Cohen <phillco@fb.com>
parents: 34783
diff changeset
  1942
34054
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  1943
    def clearunknown(self):
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  1944
        """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
  1945
        ``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
  1946
        """
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  1947
        wvfs = self._repo.wvfs
34556
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1948
        f = self._path
34833
07bbb208a924 context: audit paths before clearing unknown files and dirs
Mark Thomas <mbthomas@fb.com>
parents: 34787
diff changeset
  1949
        wvfs.audit(f)
34556
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1950
        if wvfs.isdir(f) and not wvfs.islink(f):
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1951
            wvfs.rmtree(f, forcibly=True)
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1952
        for p in reversed(list(util.finddirs(f))):
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1953
            if wvfs.isfileorlink(p):
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1954
                wvfs.unlink(p)
7a8a16f8ea22 context: also consider path conflicts when clearing unknown files
Mark Thomas <mbthomas@fb.com>
parents: 34480
diff changeset
  1955
                break
34054
65ae54582713 merge: move some of the logic in batchget() to workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34017
diff changeset
  1956
33096
873f638fd7db merge: change repo.wvfs.setflags calls to a new wctx[f].setflags function
Phil Cohen <phillco@fb.com>
parents: 33038
diff changeset
  1957
    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
  1958
        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
  1959
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1960
class overlayworkingctx(workingctx):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1961
    """Wraps another mutable context with a write-back cache that can be flushed
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1962
    at a later time.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1963
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1964
    self._cache[path] maps to a dict with keys: {
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1965
        'exists': bool?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1966
        'date': date?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1967
        'data': str?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1968
        'flags': str?
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1969
    }
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1970
    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
  1971
    is `False`, the file was deleted.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1972
    """
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1973
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1974
    def __init__(self, repo, wrappedctx):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1975
        super(overlayworkingctx, self).__init__(repo)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1976
        self._repo = repo
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1977
        self._wrappedctx = wrappedctx
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1978
        self._clean()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1979
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1980
    def data(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1981
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1982
            if self._cache[path]['exists']:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1983
                if self._cache[path]['data']:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1984
                    return self._cache[path]['data']
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1985
                else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1986
                    # Must fallback here, too, because we only set flags.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1987
                    return self._wrappedctx[path].data()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1988
            else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1989
                raise error.ProgrammingError("No such file or directory: %s" %
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1990
                                             self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1991
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1992
            return self._wrappedctx[path].data()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1993
34681
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1994
    def isinmemory(self):
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1995
        return True
4dc8a2ee0f4f context: add is `isinmemory()` to filectx
Phil Cohen <phillco@fb.com>
parents: 34556
diff changeset
  1996
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1997
    def filedate(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1998
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  1999
            return self._cache[path]['date']
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2000
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2001
            return self._wrappedctx[path].date()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2002
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2003
    def flags(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2004
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2005
            if self._cache[path]['exists']:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2006
                return self._cache[path]['flags']
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2007
            else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2008
                raise error.ProgrammingError("No such file or directory: %s" %
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2009
                                             self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2010
        else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2011
            return self._wrappedctx[path].flags()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2012
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2013
    def write(self, path, data, flags=''):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2014
        if data is None:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2015
            raise error.ProgrammingError("data must be non-None")
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2016
        self._markdirty(path, exists=True, data=data, date=util.makedate(),
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2017
                        flags=flags)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2018
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2019
    def setflags(self, path, l, x):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2020
        self._markdirty(path, exists=True, date=util.makedate(),
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2021
                        flags=(l and 'l' or '') + (x and 'x' or ''))
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2022
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2023
    def remove(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2024
        self._markdirty(path, exists=False)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2025
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2026
    def exists(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2027
        """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
  2028
        return False if they are broken.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2029
        """
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2030
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2031
            # 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
  2032
            # exists on the destination path.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2033
            if (self._cache[path]['exists'] and
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2034
                        'l' in self._cache[path]['flags']):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2035
                return self.exists(self._cache[path]['data'].strip())
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2036
            else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2037
                return self._cache[path]['exists']
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2038
        return self._wrappedctx[path].exists()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2039
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2040
    def lexists(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2041
        """lexists returns True if the path exists"""
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2042
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2043
            return self._cache[path]['exists']
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2044
        return self._wrappedctx[path].lexists()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2045
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2046
    def size(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2047
        if self.isdirty(path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2048
            if self._cache[path]['exists']:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2049
                return len(self._cache[path]['data'])
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2050
            else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2051
                raise error.ProgrammingError("No such file or directory: %s" %
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2052
                                             self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2053
        return self._wrappedctx[path].size()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2054
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2055
    def flushall(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2056
        for path in self._writeorder:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2057
            entry = self._cache[path]
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2058
            if entry['exists']:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2059
                self._wrappedctx[path].clearunknown()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2060
                if entry['data'] is not None:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2061
                    if entry['flags'] is None:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2062
                        raise error.ProgrammingError('data set but not flags')
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2063
                    self._wrappedctx[path].write(
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2064
                        entry['data'],
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2065
                        entry['flags'])
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2066
                else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2067
                    self._wrappedctx[path].setflags(
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2068
                        'l' in entry['flags'],
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2069
                        'x' in entry['flags'])
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2070
            else:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2071
                self._wrappedctx[path].remove(path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2072
        self._clean()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2073
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2074
    def isdirty(self, path):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2075
        return path in self._cache
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2076
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2077
    def _clean(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2078
        self._cache = {}
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2079
        self._writeorder = []
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2080
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2081
    def _markdirty(self, path, exists, data=None, date=None, flags=''):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2082
        if path not in self._cache:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2083
            self._writeorder.append(path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2084
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2085
        self._cache[path] = {
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2086
            'exists': exists,
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2087
            'data': data,
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2088
            'date': date,
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2089
            'flags': flags,
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2090
        }
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2091
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2092
    def filectx(self, path, filelog=None):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2093
        return overlayworkingfilectx(self._repo, path, parent=self,
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2094
                                     filelog=filelog)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2095
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2096
class overlayworkingfilectx(workingfilectx):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2097
    """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
  2098
    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
  2099
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2100
    def __init__(self, repo, path, filelog=None, parent=None):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2101
        super(overlayworkingfilectx, self).__init__(repo, path, filelog,
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2102
                                                    parent)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2103
        self._repo = repo
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2104
        self._parent = parent
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2105
        self._path = path
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2106
34783
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2107
    def cmp(self, fctx):
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2108
        return self.data() != fctx.data()
0c812885586b context: add overlayfilectx.cmp()
Phil Cohen <phillco@fb.com>
parents: 34685
diff changeset
  2109
34119
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2110
    def ctx(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2111
        return self._parent
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2112
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2113
    def data(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2114
        return self._parent.data(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2115
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2116
    def date(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2117
        return self._parent.filedate(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2118
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2119
    def exists(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2120
        return self.lexists()
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2121
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2122
    def lexists(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2123
        return self._parent.exists(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2124
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2125
    def renamed(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2126
        # Copies are currently tracked in the dirstate as before. Straight copy
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2127
        # from workingfilectx.
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2128
        rp = self._repo.dirstate.copied(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2129
        if not rp:
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2130
            return None
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2131
        return rp, self._changectx._parents[0]._manifest.get(rp, nullid)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2132
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2133
    def size(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2134
        return self._parent.size(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2135
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2136
    def audit(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2137
        pass
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2138
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2139
    def flags(self):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2140
        return self._parent.flags(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2141
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2142
    def setflags(self, islink, isexec):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2143
        return self._parent.setflags(self._path, islink, isexec)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2144
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2145
    def write(self, data, flags, backgroundclose=False):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2146
        return self._parent.write(self._path, data, flags)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2147
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2148
    def remove(self, ignoremissing=False):
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2149
        return self._parent.remove(self._path)
f698bb31bdfb context: add overlayworkingcontext and overlayworkingfilectx
Phil Cohen <phillco@fb.com>
parents: 34068
diff changeset
  2150
23710
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2151
class workingcommitctx(workingctx):
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2152
    """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
  2153
    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
  2154
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2155
    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
  2156
    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
  2157
    """
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2158
    def __init__(self, repo, changes,
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2159
                 text="", user=None, date=None, extra=None):
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2160
        super(workingctx, self).__init__(repo, text, user, date, extra,
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2161
                                         changes)
745e3b485632 context: add workingcommitctx for exact context to be committed
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23709
diff changeset
  2162
33955
e43264525ce5 context: remove unnecessary default values for matchers (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 33954
diff changeset
  2163
    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
  2164
        """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
  2165
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2166
        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
  2167
        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
  2168
        """
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2169
        if clean:
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2170
            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
  2171
        else:
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2172
            clean = []
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2173
        return scmutil.status([f for f in self._status.modified if match(f)],
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2174
                              [f for f in self._status.added if match(f)],
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2175
                              [f for f in self._status.removed if match(f)],
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2176
                              [], [], [], clean)
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2177
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2178
    @propertycache
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2179
    def _changedset(self):
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2180
        """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
  2181
        """
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2182
        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
  2183
        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
  2184
        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
  2185
        return changed
bfce25d25c96 context: override _dirstatestatus in workingcommitctx for correct matching
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23711
diff changeset
  2186
27906
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2187
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
  2188
    """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
  2189
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2190
    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
  2191
    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
  2192
    memctx.
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2193
    """
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2194
    cache = {}
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2195
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2196
    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
  2197
        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
  2198
            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
  2199
        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
  2200
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2201
    return getfilectx
c183f7b79541 context: don't use util.cachefunc due to cycle creation (issue5043)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27813
diff changeset
  2202
32783
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2203
def memfilefromctx(ctx):
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2204
    """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
  2205
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2206
    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
  2207
    context.
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2208
    """
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2209
    def getfilectx(repo, memctx, path):
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2210
        fctx = ctx[path]
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2211
        # this is weird but apparently we only keep track of one parent
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2212
        # (why not only store that instead of a tuple?)
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2213
        copied = fctx.renamed()
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2214
        if copied:
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2215
            copied = copied[0]
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2216
        return memfilectx(repo, path, fctx.data(),
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2217
                          islink=fctx.islink(), isexec=fctx.isexec(),
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2218
                          copied=copied, memctx=memctx)
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2219
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2220
    return getfilectx
34be21aa2b26 memctx: refactor inline getfilectx into convenience method
Sean Farley <sean@farley.io>
parents: 32772
diff changeset
  2221
32784
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2222
def memfilefrompatch(patchstore):
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2223
    """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
  2224
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2225
    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
  2226
    """
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2227
    def getfilectx(repo, memctx, path):
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2228
        data, mode, copied = patchstore.getfile(path)
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2229
        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
  2230
            return None
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2231
        islink, isexec = mode
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2232
        return memfilectx(repo, path, data, islink=islink,
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2233
                          isexec=isexec, copied=copied,
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2234
                          memctx=memctx)
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2235
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2236
    return getfilectx
ec302748edd8 context: add convenience method for returning a memfilectx from a patch
Sean Farley <sean@farley.io>
parents: 32783
diff changeset
  2237
21665
d2743be1bb06 memctx: inherit from committablectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21664
diff changeset
  2238
class memctx(committablectx):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2239
    """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
  2240
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2241
    Revision information is supplied at initialization time while
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2242
    related files data and is made available through a callback
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2243
    mechanism.  'repo' is the current localrepo, 'parents' is a
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2244
    sequence of two parent revisions identifiers (pass None for every
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2245
    missing parent), 'text' is the commit message and 'files' lists
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2246
    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
  2247
    repository root).
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2248
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2249
    filectxfn(repo, memctx, path) is a callable receiving the
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2250
    repository, the current memctx object and the normalized path of
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2251
    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
  2252
    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
  2253
    undefined. If the file is available in the revision being
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2254
    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
  2255
    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
  2256
    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
  2257
    removed and the new file added with copy information (see
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2258
    memfilectx).
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2259
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2260
    user receives the committer name and defaults to current
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2261
    repository username, date is the commit date in any format
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2262
    supported by util.parsedate() and defaults to current date, extra
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2263
    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
  2264
    """
22313
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2265
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2266
    # 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
  2267
    # 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
  2268
    # 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
  2269
    _returnnoneformissingfiles = True
d226fe36e362 memctx: allow extensions to determine what filectxfn should do
Siddharth Agarwal <sid0@fb.com>
parents: 22296
diff changeset
  2270
6721
521c6c6f3b9b kill some trailing spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6718
diff changeset
  2271
    def __init__(self, repo, parents, text, files, filectxfn, user=None,
32785
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2272
                 date=None, extra=None, branch=None, editor=False):
21666
31bdc51b0f1e memctx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21665
diff changeset
  2273
        super(memctx, self).__init__(repo, text, user, date, extra)
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2274
        self._rev = None
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2275
        self._node = None
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2276
        parents = [(p or nullid) for p in parents]
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2277
        p1, p2 = parents
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6744
diff changeset
  2278
        self._parents = [changectx(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
  2279
        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
  2280
        self._files = files
32785
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2281
        if branch is not None:
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2282
            self._extra['branch'] = encoding.fromlocal(branch)
21938
c8411fb5dfef memctx: substate needs to be {} instead of None
Sean Farley <sean.michael.farley@gmail.com>
parents: 21895
diff changeset
  2283
        self.substate = {}
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2284
32785
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2285
        if isinstance(filectxfn, patch.filestore):
32801
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2286
            filectxfn = memfilefrompatch(filectxfn)
32785
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2287
        elif not callable(filectxfn):
041d976b662a context: inline makememctx (API)
Sean Farley <sean@farley.io>
parents: 32784
diff changeset
  2288
            # 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
  2289
            filectxfn = memfilefromctx(filectxfn)
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2290
448fc659a430 memctx: always use cache for filectxfn
Sean Farley <sean@farley.io>
parents: 32785
diff changeset
  2291
        # 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
  2292
        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
  2293
21238
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2294
        if editor:
25d6fdc0294a context: move editor invocation from "makememctx()" to "memctx.__init__()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21203
diff changeset
  2295
            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
  2296
            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
  2297
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2298
    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
  2299
        """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
  2300
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22207
diff changeset
  2301
        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
  2302
        return self._filectxfn(self._repo, self, path)
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2303
11151
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2304
    def commit(self):
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2305
        """commit context to the repo"""
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2306
        return self._repo.commitctx(self)
c5c190822501 slightly improve memctx api
Alexander Solovyov <piranha@piranha.org.ua>
parents: 11144
diff changeset
  2307
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2308
    @propertycache
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2309
    def _manifest(self):
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2310
        """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
  2311
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2312
        # 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
  2313
        pctx = self._parents[0]
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2314
        man = pctx.manifest().copy()
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2315
23603
d74eb8d477d5 memctx: calculate manifest more efficiently
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23602
diff changeset
  2316
        for f in self._status.modified:
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2317
            p1node = nullid
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2318
            p2node = nullid
22075
2f0358275501 memctx: add note about p2
Sean Farley <sean.michael.farley@gmail.com>
parents: 22074
diff changeset
  2319
            p = pctx[f].parents() # if file isn't in pctx, check p2?
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2320
            if len(p) > 0:
27983
b7af616ca675 memctx: fix memctx manifest file hashes
Durham Goode <durham@fb.com>
parents: 27941
diff changeset
  2321
                p1node = p[0].filenode()
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2322
                if len(p) > 1:
27983
b7af616ca675 memctx: fix memctx manifest file hashes
Durham Goode <durham@fb.com>
parents: 27941
diff changeset
  2323
                    p2node = p[1].filenode()
23603
d74eb8d477d5 memctx: calculate manifest more efficiently
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23602
diff changeset
  2324
            man[f] = revlog.hash(self[f].data(), p1node, p2node)
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2325
23588
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2326
        for f in self._status.added:
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2327
            man[f] = revlog.hash(self[f].data(), nullid, nullid)
87a76cff7147 memctx: calculate manifest including newly added files correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23587
diff changeset
  2328
23589
200215cdf7aa memctx: calculate manifest correctly with newly-removed files (issue4470)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23588
diff changeset
  2329
        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
  2330
            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
  2331
                del man[f]
21835
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2332
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2333
        return man
b342c3e2518a memctx: add _manifest implementation that computes the filenode
Sean Farley <sean.michael.farley@gmail.com>
parents: 21834
diff changeset
  2334
23587
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2335
    @propertycache
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2336
    def _status(self):
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2337
        """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
  2338
        """
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2339
        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
  2340
        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
  2341
        # "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
  2342
        # 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
  2343
        # 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
  2344
        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
  2345
            man2 = p2.manifest()
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2346
            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
  2347
        else:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2348
            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
  2349
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2350
        modified, added, removed = [], [], []
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2351
        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
  2352
            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
  2353
                added.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2354
            elif self[f]:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2355
                modified.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2356
            else:
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2357
                removed.append(f)
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2358
8063901e56cd memctx: calculate exact status being committed from specified files
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23584
diff changeset
  2359
        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
  2360
21688
cc677803bad4 memfilectx: inherit from committablefilectx
Sean Farley <sean.michael.farley@gmail.com>
parents: 21687
diff changeset
  2361
class memfilectx(committablefilectx):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2362
    """memfilectx represents an in-memory file to commit.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2363
23139
e53f6b72a0e4 spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 23110
diff changeset
  2364
    See memctx and committablefilectx for more details.
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2365
    """
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21688
diff changeset
  2366
    def __init__(self, repo, path, data, islink=False,
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21688
diff changeset
  2367
                 isexec=False, copied=None, memctx=None):
7077
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2368
        """
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2369
        path is the normalized file path relative to repository root.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2370
        data is the file content as a string.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2371
        islink is True if the file is a symbolic link.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2372
        isexec is True if the file is executable.
ccbd39cad3c3 context: improve memctx documentation
Patrick Mezard <pmezard@gmail.com>
parents: 7008
diff changeset
  2373
        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
  2374
        revision being committed, or None."""
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21688
diff changeset
  2375
        super(memfilectx, self).__init__(repo, path, None, memctx)
6715
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2376
        self._data = data
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2377
        self._flags = (islink and 'l' or '') + (isexec and 'x' or '')
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2378
        self._copied = None
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2379
        if copied:
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2380
            self._copied = (copied, nullid)
a3c41abfa828 context: add memctx for memory commits
Patrick Mezard <pmezard@gmail.com>
parents: 6709
diff changeset
  2381
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2382
    def data(self):
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  2383
        return self._data
22074
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2384
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2385
    def remove(self, ignoremissing=False):
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2386
        """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
  2387
        # 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
  2388
        del self._changectx[self._path]
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2389
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2390
    def write(self, data, flags):
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2391
        """wraps repo.wwrite"""
fbe967b027bd memfilectx: add remove and write methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 22073
diff changeset
  2392
        self._data = data
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2393
32283
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2394
class overlayfilectx(committablefilectx):
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2395
    """Like memfilectx but take an original filectx and optional parameters to
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2396
    override parts of it. This is useful when fctx.data() is expensive (i.e.
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2397
    flag processor is expensive) and raw data, flags, and filenode could be
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2398
    reused (ex. rebase or mode-only amend a REVIDX_EXTSTORED file).
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2399
    """
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2400
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2401
    def __init__(self, originalfctx, datafunc=None, path=None, flags=None,
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2402
                 copied=None, ctx=None):
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2403
        """originalfctx: filecontext to duplicate
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2404
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2405
        datafunc: None or a function to override data (file content). It is a
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2406
        function to be lazy. path, flags, copied, ctx: None or overridden value
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2407
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2408
        copied could be (path, rev), or False. copied could also be just path,
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2409
        and will be converted to (path, nullid). This simplifies some callers.
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2410
        """
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2411
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2412
        if path is None:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2413
            path = originalfctx.path()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2414
        if ctx is None:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2415
            ctx = originalfctx.changectx()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2416
            ctxmatch = lambda: True
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2417
        else:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2418
            ctxmatch = lambda: ctx == originalfctx.changectx()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2419
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2420
        repo = originalfctx.repo()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2421
        flog = originalfctx.filelog()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2422
        super(overlayfilectx, self).__init__(repo, path, flog, ctx)
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2423
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2424
        if copied is None:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2425
            copied = originalfctx.renamed()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2426
            copiedmatch = lambda: True
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2427
        else:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2428
            if copied and not isinstance(copied, tuple):
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2429
                # repo._filecommit will recalculate copyrev so nullid is okay
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2430
                copied = (copied, nullid)
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2431
            copiedmatch = lambda: copied == originalfctx.renamed()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2432
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2433
        # When data, copied (could affect data), ctx (could affect filelog
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2434
        # parents) are not overridden, rawdata, rawflags, and filenode may be
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2435
        # reused (repo._filecommit should double check filelog parents).
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2436
        #
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2437
        # path, flags are not hashed in filelog (but in manifestlog) so they do
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2438
        # not affect reusable here.
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2439
        #
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2440
        # If ctx or copied is overridden to a same value with originalfctx,
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2441
        # still consider it's reusable. originalfctx.renamed() may be a bit
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2442
        # expensive so it's not called unless necessary. Assuming datafunc is
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2443
        # always expensive, do not call it for this "reusable" test.
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2444
        reusable = datafunc is None and ctxmatch() and copiedmatch()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2445
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2446
        if datafunc is None:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2447
            datafunc = originalfctx.data
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2448
        if flags is None:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2449
            flags = originalfctx.flags()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2450
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2451
        self._datafunc = datafunc
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2452
        self._flags = flags
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2453
        self._copied = copied
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2454
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2455
        if reusable:
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2456
            # copy extra fields from originalfctx
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2457
            attrs = ['rawdata', 'rawflags', '_filenode', '_filerev']
34432
52e9310626a8 context: rename local 'attr' to 'attr_'
Siddharth Agarwal <sid0@fb.com>
parents: 34431
diff changeset
  2458
            for attr_ in attrs:
52e9310626a8 context: rename local 'attr' to 'attr_'
Siddharth Agarwal <sid0@fb.com>
parents: 34431
diff changeset
  2459
                if util.safehasattr(originalfctx, attr_):
52e9310626a8 context: rename local 'attr' to 'attr_'
Siddharth Agarwal <sid0@fb.com>
parents: 34431
diff changeset
  2460
                    setattr(self, attr_, getattr(originalfctx, attr_))
32283
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2461
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2462
    def data(self):
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2463
        return self._datafunc()
07da778f3b58 filectx: add an overlayfilectx class
Jun Wu <quark@fb.com>
parents: 32282
diff changeset
  2464
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2465
class metadataonlyctx(committablectx):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2466
    """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
  2467
    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
  2468
    metadata-only changes.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2469
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2470
    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
  2471
    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
  2472
    '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
  2473
    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
  2474
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2475
    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
  2476
    username, date is the commit date in any format supported by
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2477
    util.parsedate() and defaults to current date, extra is a dictionary of
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2478
    metadata or is left empty.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2479
    """
30614
9bf43a72b49d context: correct metadataonlyctx's parameter
Jun Wu <quark@fb.com>
parents: 30572
diff changeset
  2480
    def __new__(cls, repo, originalctx, *args, **kwargs):
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2481
        return super(metadataonlyctx, cls).__new__(cls, repo)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2482
34016
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2483
    def __init__(self, repo, originalctx, parents=None, text=None, user=None,
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2484
                 date=None, extra=None, editor=False):
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2485
        if text is None:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2486
            text = originalctx.description()
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2487
        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
  2488
        self._rev = None
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2489
        self._node = None
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2490
        self._originalctx = originalctx
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2491
        self._manifestnode = originalctx.manifestnode()
34016
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2492
        if parents is None:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2493
            parents = originalctx.parents()
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2494
        else:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2495
            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
  2496
        parents = parents[:]
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2497
        while len(parents) < 2:
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2498
            parents.append(repo[nullid])
becce02036e1 context: make parents and text optional in metadataonlyctx
Jun Wu <quark@fb.com>
parents: 33955
diff changeset
  2499
        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
  2500
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2501
        # 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
  2502
        # manifests of our commit parents
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2503
        mp1, mp2 = self.manifestctx().parents
31840
7973e0a15bd4 metadataonlyctx: replace "changeset()[0]" to "manifestnode()"
Jun Wu <quark@fb.com>
parents: 31668
diff changeset
  2504
        if p1 != nullid and p1.manifestnode() != mp1:
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2505
            raise RuntimeError('can\'t reuse the manifest: '
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2506
                               'its p1 doesn\'t match the new ctx p1')
31840
7973e0a15bd4 metadataonlyctx: replace "changeset()[0]" to "manifestnode()"
Jun Wu <quark@fb.com>
parents: 31668
diff changeset
  2507
        if p2 != nullid and p2.manifestnode() != mp2:
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2508
            raise RuntimeError('can\'t reuse the manifest: '
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2509
                               'its p2 doesn\'t match the new ctx p2')
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2510
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2511
        self._files = originalctx.files()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2512
        self.substate = {}
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2513
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2514
        if editor:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2515
            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
  2516
            self._repo.savecommitmessage(self._text)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2517
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2518
    def manifestnode(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2519
        return self._manifestnode
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2520
32552
6ae068f801e3 context: do not cache manifestctx
Jun Wu <quark@fb.com>
parents: 32519
diff changeset
  2521
    @property
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2522
    def _manifestctx(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2523
        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
  2524
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2525
    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
  2526
        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
  2527
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2528
    def commit(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2529
        """commit context to the repo"""
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2530
        return self._repo.commitctx(self)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2531
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2532
    @property
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2533
    def _manifest(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2534
        return self._originalctx.manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2535
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2536
    @propertycache
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2537
    def _status(self):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2538
        """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
  2539
        and parents manifests.
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2540
        """
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2541
        man1 = self.p1().manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2542
        p2 = self._parents[1]
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2543
        # "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
  2544
        # 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
  2545
        # 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
  2546
        if p2.node() != nullid:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2547
            man2 = p2.manifest()
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2548
            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
  2549
        else:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2550
            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
  2551
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2552
        modified, added, removed = [], [], []
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2553
        for f in self._files:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2554
            if not managing(f):
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2555
                added.append(f)
34017
be814edf3306 metadataonlyctx: don't crash when reusing the manifest with deletions
Jun Wu <quark@fb.com>
parents: 34016
diff changeset
  2556
            elif f in self:
30572
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2557
                modified.append(f)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2558
            else:
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2559
                removed.append(f)
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2560
73ce055b169a memctx: allow the metadataonlyctx thats reusing the manifest node
Mateusz Kwapich <mitrandir@fb.com>
parents: 30371
diff changeset
  2561
        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
  2562
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2563
class arbitraryfilectx(object):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2564
    """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
  2565
    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
  2566
    """
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  2567
    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
  2568
        # 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
  2569
        self._repo = repo
34068
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2570
        self._path = path
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2571
34685
6036e6e205ca context: add a fast-comparision for arbitraryfilectx and workingfilectx
Phil Cohen <phillco@fb.com>
parents: 34681
diff changeset
  2572
    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
  2573
        # 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
  2574
        # path if either side is a symlink.
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  2575
        symlinks = ('l' in self.flags() or 'l' in fctx.flags())
14c87708f432 arbitraryfilecontext: skip the cmp fast path if any side is a symlink
Phil Cohen <phillco@fb.com>
parents: 34833
diff changeset
  2576
        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
  2577
            # 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
  2578
            # 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
  2579
            # 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
  2580
            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
  2581
        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
  2582
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2583
    def path(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2584
        return self._path
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2585
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2586
    def flags(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2587
        return ''
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2588
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2589
    def data(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2590
        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
  2591
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2592
    def decodeddata(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2593
        with open(self._path, "rb") as f:
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2594
            return f.read()
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2595
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2596
    def remove(self):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2597
        util.unlink(self._path)
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2598
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2599
    def write(self, data, flags):
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2600
        assert not flags
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2601
        with open(self._path, "w") as f:
d2fc88426d21 context: add arbitraryfilectx, which can represent files outside the workdir
Phil Cohen <phillco@fb.com>
parents: 34054
diff changeset
  2602
            f.write(data)