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