mercurial/sparse.py
author Gregory Szorc <gregory.szorc@gmail.com>
Fri, 10 Aug 2018 15:06:41 -0700
changeset 39245 071f97d03acb
parent 38862 1ff45c518e6f
child 39527 9db856446298
permissions -rw-r--r--
manifest: rename manifestlog._treeinmem to ._treemanifests Not sure what "inmem" was supposed to indicate. This object is an interface to manifest data on disk as well as "in memory" (assuming that's what "inmem" means). Differential Revision: https://phab.mercurial-scm.org/D4278
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     1
# sparse.py - functionality for sparse checkouts
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
#
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
# Copyright 2014 Facebook, Inc.
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
#
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
from __future__ import absolute_import
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
    10
import collections
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
    11
import hashlib
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
    12
import os
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
    13
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    14
from .i18n import _
35582
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34548
diff changeset
    15
from .node import (
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34548
diff changeset
    16
    hex,
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34548
diff changeset
    17
    nullid,
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34548
diff changeset
    18
)
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    19
from . import (
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    20
    error,
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
    21
    match as matchmod,
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
    22
    merge as mergemod,
33685
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
    23
    pathutil,
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
    24
    pycompat,
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
    25
    scmutil,
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
    26
    util,
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    27
)
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    28
33299
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
    29
# Whether sparse features are enabled. This variable is intended to be
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
    30
# temporary to facilitate porting sparse to core. It should eventually be
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
    31
# a per-repo option, possibly a repo requirement.
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
    32
enabled = False
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
    33
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
    34
def parseconfig(ui, raw, action):
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    35
    """Parse sparse config file content.
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    36
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
    37
    action is the command which is trigerring this read, can be narrow, sparse
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
    38
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    39
    Returns a tuple of includes, excludes, and profiles.
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    40
    """
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    41
    includes = set()
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    42
    excludes = set()
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
    43
    profiles = set()
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    44
    current = None
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    45
    havesection = False
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    46
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    47
    for line in raw.split('\n'):
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    48
        line = line.strip()
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    49
        if not line or line.startswith('#'):
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    50
            # empty or comment line, skip
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    51
            continue
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    52
        elif line.startswith('%include '):
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    53
            line = line[9:].strip()
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    54
            if line:
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
    55
                profiles.add(line)
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    56
        elif line == '[include]':
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    57
            if havesection and current != includes:
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    58
                # TODO pass filename into this API so we can report it.
38862
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    59
                raise error.Abort(_('%(action)s config cannot have includes '
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    60
                                    'after excludes') % {'action': action})
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    61
            havesection = True
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    62
            current = includes
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    63
            continue
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    64
        elif line == '[exclude]':
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    65
            havesection = True
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    66
            current = excludes
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    67
        elif line:
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    68
            if current is None:
38862
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    69
                raise error.Abort(_('%(action)s config entry outside of '
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    70
                                    'section: %(line)s')
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    71
                                  % {'action': action, 'line': line},
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    72
                                  hint=_('add an [include] or [exclude] line '
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    73
                                         'to declare the entry type'))
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33550
diff changeset
    74
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    75
            if line.strip().startswith('/'):
38862
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    76
                ui.warn(_('warning: %(action)s profile cannot use'
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    77
                          ' paths starting with /, ignoring %(line)s\n')
1ff45c518e6f sparse: use named parameters in i18n strings
Yuya Nishihara <yuya@tcha.org>
parents: 38861
diff changeset
    78
                        % {'action': action, 'line': line})
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    79
                continue
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    80
            current.add(line)
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    81
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    82
    return includes, excludes, profiles
33298
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    83
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    84
# Exists as separate function to facilitate monkeypatching.
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    85
def readprofile(repo, profile, changeid):
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    86
    """Resolve the raw content of a sparse profile file."""
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    87
    # TODO add some kind of cache here because this incurs a manifest
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    88
    # resolve and can be slow.
f41a99c45956 sparse: move profile reading into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33297
diff changeset
    89
    return repo.filectx(profile, changeid=changeid).data()
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    90
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    91
def patternsforrev(repo, rev):
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    92
    """Obtain sparse checkout patterns for the given rev.
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    93
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    94
    Returns a tuple of iterables representing includes, excludes, and
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    95
    patterns.
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    96
    """
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    97
    # Feature isn't enabled. No-op.
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
    98
    if not enabled:
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
    99
        return set(), set(), set()
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   100
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   101
    raw = repo.vfs.tryread('sparse')
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   102
    if not raw:
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
   103
        return set(), set(), set()
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   104
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   105
    if rev is None:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   106
        raise error.Abort(_('cannot parse sparse patterns from working '
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   107
                            'directory'))
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   108
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   109
    includes, excludes, profiles = parseconfig(repo.ui, raw, 'sparse')
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   110
    ctx = repo[rev]
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   111
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   112
    if profiles:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   113
        visited = set()
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   114
        while profiles:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   115
            profile = profiles.pop()
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   116
            if profile in visited:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   117
                continue
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   118
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   119
            visited.add(profile)
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   120
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   121
            try:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   122
                raw = readprofile(repo, profile, rev)
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   123
            except error.ManifestLookupError:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   124
                msg = (
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   125
                    "warning: sparse profile '%s' not found "
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   126
                    "in rev %s - ignoring it\n" % (profile, ctx))
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   127
                # experimental config: sparse.missingwarning
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   128
                if repo.ui.configbool(
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33447
diff changeset
   129
                        'sparse', 'missingwarning'):
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   130
                    repo.ui.warn(msg)
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   131
                else:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   132
                    repo.ui.debug(msg)
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   133
                continue
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   134
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   135
            pincludes, pexcludes, subprofs = parseconfig(repo.ui, raw, 'sparse')
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   136
            includes.update(pincludes)
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   137
            excludes.update(pexcludes)
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
   138
            profiles.update(subprofs)
33300
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   139
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   140
        profiles = visited
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   141
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   142
    if includes:
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   143
        includes.add('.hg*')
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   144
f7a106b3f089 sparse: move resolving of sparse patterns for rev into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33299
diff changeset
   145
    return includes, excludes, profiles
33301
ca4b78eb11e7 sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33300
diff changeset
   146
33370
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   147
def activeconfig(repo):
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   148
    """Determine the active sparse config rules.
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   149
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   150
    Rules are constructed by reading the current sparse config and bringing in
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   151
    referenced profiles from parents of the working directory.
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   152
    """
33301
ca4b78eb11e7 sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33300
diff changeset
   153
    revs = [repo.changelog.rev(node) for node in
ca4b78eb11e7 sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33300
diff changeset
   154
            repo.dirstate.parents() if node != nullid]
ca4b78eb11e7 sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33300
diff changeset
   155
33370
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   156
    allincludes = set()
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   157
    allexcludes = set()
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   158
    allprofiles = set()
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   159
33301
ca4b78eb11e7 sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33300
diff changeset
   160
    for rev in revs:
33370
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   161
        includes, excludes, profiles = patternsforrev(repo, rev)
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   162
        allincludes |= includes
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   163
        allexcludes |= excludes
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
   164
        allprofiles |= profiles
33301
ca4b78eb11e7 sparse: move active profiles function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33300
diff changeset
   165
33370
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   166
    return allincludes, allexcludes, allprofiles
33302
36a415b5a4b2 localrepo: add sparse caches
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33301
diff changeset
   167
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   168
def configsignature(repo, includetemp=True):
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   169
    """Obtain the signature string for the current sparse configuration.
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   170
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   171
    This is used to construct a cache key for matchers.
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   172
    """
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   173
    cache = repo._sparsesignaturecache
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   174
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   175
    signature = cache.get('signature')
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   176
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   177
    if includetemp:
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   178
        tempsignature = cache.get('tempsignature')
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   179
    else:
33318
526255fe7899 sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33317
diff changeset
   180
        tempsignature = '0'
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   181
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   182
    if signature is None or (includetemp and tempsignature is None):
35582
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34548
diff changeset
   183
        signature = hex(hashlib.sha1(repo.vfs.tryread('sparse')).digest())
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   184
        cache['signature'] = signature
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   185
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   186
        if includetemp:
33318
526255fe7899 sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33317
diff changeset
   187
            raw = repo.vfs.tryread('tempsparse')
35582
72b91f905065 py3: use node.hex(h.digest()) instead of h.hexdigest()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34548
diff changeset
   188
            tempsignature = hex(hashlib.sha1(raw).digest())
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   189
            cache['tempsignature'] = tempsignature
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   190
33318
526255fe7899 sparse: clean up config signature code
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33317
diff changeset
   191
    return '%s %s' % (signature, tempsignature)
33317
df1287268cc0 sparse: move config signature logic into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33304
diff changeset
   192
33303
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   193
def writeconfig(repo, includes, excludes, profiles):
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   194
    """Write the sparse config file given a sparse configuration."""
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   195
    with repo.vfs('sparse', 'wb') as fh:
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   196
        for p in sorted(profiles):
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   197
            fh.write('%%include %s\n' % p)
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   198
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   199
        if includes:
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   200
            fh.write('[include]\n')
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   201
            for i in sorted(includes):
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   202
                fh.write(i)
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   203
                fh.write('\n')
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   204
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   205
        if excludes:
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   206
            fh.write('[exclude]\n')
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   207
            for e in sorted(excludes):
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   208
                fh.write(e)
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   209
                fh.write('\n')
8b571495d811 sparse: move config file writing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33302
diff changeset
   210
33325
38df146d0697 sparse: inline signature cache clearing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33324
diff changeset
   211
    repo._sparsesignaturecache.clear()
33304
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   212
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   213
def readtemporaryincludes(repo):
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   214
    raw = repo.vfs.tryread('tempsparse')
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   215
    if not raw:
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   216
        return set()
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   217
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   218
    return set(raw.split('\n'))
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   219
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   220
def writetemporaryincludes(repo, includes):
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   221
    repo.vfs.write('tempsparse', '\n'.join(sorted(includes)))
33325
38df146d0697 sparse: inline signature cache clearing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33324
diff changeset
   222
    repo._sparsesignaturecache.clear()
33304
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   223
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   224
def addtemporaryincludes(repo, additional):
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   225
    includes = readtemporaryincludes(repo)
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   226
    for i in additional:
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   227
        includes.add(i)
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   228
    writetemporaryincludes(repo, includes)
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   229
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   230
def prunetemporaryincludes(repo):
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   231
    if not enabled or not repo.vfs.exists('tempsparse'):
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   232
        return
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   233
33356
ccb3e5399921 sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 33355
diff changeset
   234
    s = repo.status()
ccb3e5399921 sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 33355
diff changeset
   235
    if s.modified or s.added or s.removed or s.deleted:
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   236
        # Still have pending changes. Don't bother trying to prune.
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   237
        return
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   238
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   239
    sparsematch = matcher(repo, includetemp=False)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   240
    dirstate = repo.dirstate
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   241
    actions = []
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   242
    dropped = []
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   243
    tempincludes = readtemporaryincludes(repo)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   244
    for file in tempincludes:
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   245
        if file in dirstate and not sparsematch(file):
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   246
            message = _('dropping temporarily included sparse files')
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   247
            actions.append((file, None, message))
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   248
            dropped.append(file)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   249
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   250
    typeactions = collections.defaultdict(list)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   251
    typeactions['r'] = actions
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   252
    mergemod.applyupdates(repo, typeactions, repo[None], repo['.'], False)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   253
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   254
    # Fix dirstate
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   255
    for file in dropped:
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   256
        dirstate.drop(file)
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   257
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   258
    repo.vfs.unlink('tempsparse')
33325
38df146d0697 sparse: inline signature cache clearing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33324
diff changeset
   259
    repo._sparsesignaturecache.clear()
33321
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   260
    msg = _('cleaned up %d temporarily added file(s) from the '
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   261
            'sparse checkout\n')
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   262
    repo.ui.status(msg % len(tempincludes))
d09e948dc303 sparse: move pruning of temporary includes into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33320
diff changeset
   263
33447
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   264
def forceincludematcher(matcher, includes):
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   265
    """Returns a matcher that returns true for any of the forced includes
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   266
    before testing against the actual matcher."""
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   267
    kindpats = [('path', include, '') for include in includes]
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   268
    includematcher = matchmod.includematcher('', '', kindpats)
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   269
    return matchmod.unionmatcher([includematcher, matcher])
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   270
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   271
def matcher(repo, revs=None, includetemp=True):
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   272
    """Obtain a matcher for sparse working directories for the given revs.
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   273
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   274
    If multiple revisions are specified, the matcher is the union of all
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   275
    revs.
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   276
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   277
    ``includetemp`` indicates whether to use the temporary sparse profile.
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   278
    """
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   279
    # If sparse isn't enabled, sparse matcher matches everything.
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   280
    if not enabled:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   281
        return matchmod.always(repo.root, '')
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   282
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   283
    if not revs or revs == [None]:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   284
        revs = [repo.changelog.rev(node)
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   285
                for node in repo.dirstate.parents() if node != nullid]
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   286
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   287
    signature = configsignature(repo, includetemp=includetemp)
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   288
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   289
    key = '%s %s' % (signature, ' '.join(map(pycompat.bytestr, revs)))
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   290
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   291
    result = repo._sparsematchercache.get(key)
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   292
    if result:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   293
        return result
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   294
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   295
    matchers = []
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   296
    for rev in revs:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   297
        try:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   298
            includes, excludes, profiles = patternsforrev(repo, rev)
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   299
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   300
            if includes or excludes:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   301
                matcher = matchmod.match(repo.root, '', [],
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   302
                                         include=includes, exclude=excludes,
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   303
                                         default='relpath')
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   304
                matchers.append(matcher)
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   305
        except IOError:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   306
            pass
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   307
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   308
    if not matchers:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   309
        result = matchmod.always(repo.root, '')
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   310
    elif len(matchers) == 1:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   311
        result = matchers[0]
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   312
    else:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   313
        result = matchmod.unionmatcher(matchers)
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   314
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   315
    if includetemp:
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   316
        tempincludes = readtemporaryincludes(repo)
33447
6f4e5e5940a5 match: write forceincludematcher using unionmatcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33376
diff changeset
   317
        result = forceincludematcher(result, tempincludes)
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   318
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   319
    repo._sparsematchercache[key] = result
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33318
diff changeset
   321
    return result
33322
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   322
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33322
diff changeset
   323
def filterupdatesactions(repo, wctx, mctx, branchmerge, actions):
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33322
diff changeset
   324
    """Filter updates to only lay out files that match the sparse rules."""
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33322
diff changeset
   325
    if not enabled:
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33322
diff changeset
   326
        return actions
33322
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   327
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   328
    oldrevs = [pctx.rev() for pctx in wctx.parents()]
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   329
    oldsparsematch = matcher(repo, oldrevs)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   330
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   331
    if oldsparsematch.always():
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33322
diff changeset
   332
        return actions
33322
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   333
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   334
    files = set()
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   335
    prunedactions = {}
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   336
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   337
    if branchmerge:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   338
        # If we're merging, use the wctx filter, since we're merging into
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   339
        # the wctx.
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   340
        sparsematch = matcher(repo, [wctx.parents()[0].rev()])
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   341
    else:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   342
        # If we're updating, use the target context's filter, since we're
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   343
        # moving to the target context.
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   344
        sparsematch = matcher(repo, [mctx.rev()])
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   345
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   346
    temporaryfiles = []
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   347
    for file, action in actions.iteritems():
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   348
        type, args, msg = action
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   349
        files.add(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   350
        if sparsematch(file):
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   351
            prunedactions[file] = action
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   352
        elif type == 'm':
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   353
            temporaryfiles.append(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   354
            prunedactions[file] = action
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   355
        elif branchmerge:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   356
            if type != 'k':
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   357
                temporaryfiles.append(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   358
                prunedactions[file] = action
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   359
        elif type == 'f':
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   360
            prunedactions[file] = action
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   361
        elif file in wctx:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   362
            prunedactions[file] = ('r', args, msg)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   363
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   364
    if len(temporaryfiles) > 0:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   365
        repo.ui.status(_('temporarily included %d file(s) in the sparse '
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   366
                         'checkout for merging\n') % len(temporaryfiles))
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   367
        addtemporaryincludes(repo, temporaryfiles)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   368
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   369
        # Add the new files to the working copy so they can be merged, etc
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   370
        actions = []
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   371
        message = 'temporarily adding to sparse checkout'
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   372
        wctxmanifest = repo[None].manifest()
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   373
        for file in temporaryfiles:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   374
            if file in wctxmanifest:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   375
                fctx = repo[None][file]
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   376
                actions.append((file, (fctx.flags(), False), message))
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   377
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   378
        typeactions = collections.defaultdict(list)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   379
        typeactions['g'] = actions
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   380
        mergemod.applyupdates(repo, typeactions, repo[None], repo['.'],
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   381
                              False)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   382
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   383
        dirstate = repo.dirstate
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   384
        for file, flags, msg in actions:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   385
            dirstate.normal(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   386
33370
482320104672 sparse: refactor activeprofiles into a generic function (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33356
diff changeset
   387
    profiles = activeconfig(repo)[2]
33322
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   388
    changedprofiles = profiles & files
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   389
    # If an active profile changed during the update, refresh the checkout.
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   390
    # Don't do this during a branch merge, since all incoming changes should
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   391
    # have been handled by the temporary includes above.
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   392
    if changedprofiles and not branchmerge:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   393
        mf = mctx.manifest()
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   394
        for file in mf:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   395
            old = oldsparsematch(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   396
            new = sparsematch(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   397
            if not old and new:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   398
                flags = mf.flags(file)
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   399
                prunedactions[file] = ('g', (flags, False), '')
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   400
            elif old and not new:
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   401
                prunedactions[file] = ('r', [], '')
fa6c2c3064fd sparse: move update action filtering into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33321
diff changeset
   402
33323
252500520d60 sparse: refactor update actions filtering and call from core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33322
diff changeset
   403
    return prunedactions
33324
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   404
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   405
def refreshwdir(repo, origstatus, origsparsematch, force=False):
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   406
    """Refreshes working directory by taking sparse config into account.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   407
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   408
    The old status and sparse matcher is compared against the current sparse
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   409
    matcher.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   410
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   411
    Will abort if a file with pending changes is being excluded or included
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   412
    unless ``force`` is True.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   413
    """
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   414
    # Verify there are no pending changes
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   415
    pending = set()
33356
ccb3e5399921 sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 33355
diff changeset
   416
    pending.update(origstatus.modified)
ccb3e5399921 sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 33355
diff changeset
   417
    pending.update(origstatus.added)
ccb3e5399921 sparse: access status fields by name instead of deconstructing it
Martin von Zweigbergk <martinvonz@google.com>
parents: 33355
diff changeset
   418
    pending.update(origstatus.removed)
33324
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   419
    sparsematch = matcher(repo)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   420
    abort = False
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   421
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   422
    for f in pending:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   423
        if not sparsematch(f):
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   424
            repo.ui.warn(_("pending changes to '%s'\n") % f)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   425
            abort = not force
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   426
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   427
    if abort:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   428
        raise error.Abort(_('could not update sparseness due to pending '
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   429
                            'changes'))
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   430
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   431
    # Calculate actions
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   432
    dirstate = repo.dirstate
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   433
    ctx = repo['.']
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   434
    added = []
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   435
    lookup = []
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   436
    dropped = []
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   437
    mf = ctx.manifest()
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   438
    files = set(mf)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   439
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   440
    actions = {}
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   441
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   442
    for file in files:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   443
        old = origsparsematch(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   444
        new = sparsematch(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   445
        # Add files that are newly included, or that don't exist in
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   446
        # the dirstate yet.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   447
        if (new and not old) or (old and new and not file in dirstate):
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   448
            fl = mf.flags(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   449
            if repo.wvfs.exists(file):
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   450
                actions[file] = ('e', (fl,), '')
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   451
                lookup.append(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   452
            else:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   453
                actions[file] = ('g', (fl, False), '')
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   454
                added.append(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   455
        # Drop files that are newly excluded, or that still exist in
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   456
        # the dirstate.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   457
        elif (old and not new) or (not old and not new and file in dirstate):
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   458
            dropped.append(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   459
            if file not in pending:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   460
                actions[file] = ('r', [], '')
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   461
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   462
    # Verify there are no pending changes in newly included files
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   463
    abort = False
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   464
    for file in lookup:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   465
        repo.ui.warn(_("pending changes to '%s'\n") % file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   466
        abort = not force
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   467
    if abort:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   468
        raise error.Abort(_('cannot change sparseness due to pending '
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   469
                            'changes (delete the files or use '
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   470
                            '--force to bring them back dirty)'))
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   471
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   472
    # Check for files that were only in the dirstate.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   473
    for file, state in dirstate.iteritems():
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   474
        if not file in files:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   475
            old = origsparsematch(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   476
            new = sparsematch(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   477
            if old and not new:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   478
                dropped.append(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   479
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   480
    # Apply changes to disk
34547
81aebcc73beb merge: add merge action 'p' to record path conflicts during update
Mark Thomas <mbthomas@fb.com>
parents: 33685
diff changeset
   481
    typeactions = dict((m, [])
34548
b4955650eb57 merge: add merge action 'pr' to rename files during update
Mark Thomas <mbthomas@fb.com>
parents: 34547
diff changeset
   482
                       for m in 'a f g am cd dc r dm dg m e k p pr'.split())
33324
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   483
    for f, (m, args, msg) in actions.iteritems():
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   484
        if m not in typeactions:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   485
            typeactions[m] = []
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   486
        typeactions[m].append((f, args, msg))
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   487
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   488
    mergemod.applyupdates(repo, typeactions, repo[None], repo['.'], False)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   489
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   490
    # Fix dirstate
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   491
    for file in added:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   492
        dirstate.normal(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   493
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   494
    for file in dropped:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   495
        dirstate.drop(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   496
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   497
    for file in lookup:
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   498
        # File exists on disk, and we're bringing it back in an unknown state.
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   499
        dirstate.normallookup(file)
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   500
33d0859c37bd sparse: move working directory refreshing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33323
diff changeset
   501
    return added, dropped, lookup
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   502
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   503
def aftercommit(repo, node):
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   504
    """Perform actions after a working directory commit."""
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   505
    # This function is called unconditionally, even if sparse isn't
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   506
    # enabled.
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   507
    ctx = repo[node]
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   508
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   509
    profiles = patternsforrev(repo, ctx.rev())[2]
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   510
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   511
    # profiles will only have data if sparse is enabled.
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
   512
    if profiles & set(ctx.files()):
33353
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   513
        origstatus = repo.status()
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   514
        origsparsematch = matcher(repo)
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   515
        refreshwdir(repo, origstatus, origsparsematch, force=True)
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   516
160efb559f67 sparse: move post commit actions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33325
diff changeset
   517
    prunetemporaryincludes(repo)
33354
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   518
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   519
def _updateconfigandrefreshwdir(repo, includes, excludes, profiles,
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   520
                                force=False, removing=False):
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   521
    """Update the sparse config and working directory state."""
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   522
    raw = repo.vfs.tryread('sparse')
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   523
    oldincludes, oldexcludes, oldprofiles = parseconfig(repo.ui, raw, 'sparse')
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   524
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   525
    oldstatus = repo.status()
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   526
    oldmatch = matcher(repo)
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   527
    oldrequires = set(repo.requirements)
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   528
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   529
    # TODO remove this try..except once the matcher integrates better
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   530
    # with dirstate. We currently have to write the updated config
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   531
    # because that will invalidate the matcher cache and force a
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   532
    # re-read. We ideally want to update the cached matcher on the
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   533
    # repo instance then flush the new config to disk once wdir is
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   534
    # updated. But this requires massive rework to matcher() and its
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   535
    # consumers.
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   536
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   537
    if 'exp-sparse' in oldrequires and removing:
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   538
        repo.requirements.discard('exp-sparse')
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   539
        scmutil.writerequires(repo.vfs, repo.requirements)
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   540
    elif 'exp-sparse' not in oldrequires:
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   541
        repo.requirements.add('exp-sparse')
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   542
        scmutil.writerequires(repo.vfs, repo.requirements)
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   543
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   544
    try:
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   545
        writeconfig(repo, includes, excludes, profiles)
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   546
        return refreshwdir(repo, oldstatus, oldmatch, force=force)
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   547
    except Exception:
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   548
        if repo.requirements != oldrequires:
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   549
            repo.requirements.clear()
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   550
            repo.requirements |= oldrequires
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   551
            scmutil.writerequires(repo.vfs, repo.requirements)
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   552
        writeconfig(repo, oldincludes, oldexcludes, oldprofiles)
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   553
        raise
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   554
33354
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   555
def clearrules(repo, force=False):
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   556
    """Clears include/exclude rules from the sparse config.
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   557
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   558
    The remaining sparse config only has profiles, if defined. The working
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   559
    directory is refreshed, as needed.
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   560
    """
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   561
    with repo.wlock():
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   562
        raw = repo.vfs.tryread('sparse')
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   563
        includes, excludes, profiles = parseconfig(repo.ui, raw, 'sparse')
33354
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   564
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   565
        if not includes and not excludes:
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   566
            return
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   567
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   568
        _updateconfigandrefreshwdir(repo, set(), set(), profiles, force=force)
33355
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   569
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   570
def importfromfiles(repo, opts, paths, force=False):
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   571
    """Import sparse config rules from files.
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   572
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   573
    The updated sparse config is written out and the working directory
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   574
    is refreshed, as needed.
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   575
    """
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   576
    with repo.wlock():
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   577
        # read current configuration
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   578
        raw = repo.vfs.tryread('sparse')
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   579
        includes, excludes, profiles = parseconfig(repo.ui, raw, 'sparse')
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   580
        aincludes, aexcludes, aprofiles = activeconfig(repo)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   581
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   582
        # Import rules on top; only take in rules that are not yet
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   583
        # part of the active rules.
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   584
        changed = False
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   585
        for p in paths:
37576
6ef94f24aa82 py3: make sure we open file in bytes mode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35742
diff changeset
   586
            with util.posixfile(util.expandpath(p), mode='rb') as fh:
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   587
                raw = fh.read()
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   588
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   589
            iincludes, iexcludes, iprofiles = parseconfig(repo.ui, raw,
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   590
                                                          'sparse')
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   591
            oldsize = len(includes) + len(excludes) + len(profiles)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   592
            includes.update(iincludes - aincludes)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   593
            excludes.update(iexcludes - aexcludes)
33550
32f348d741e5 sparse: use set for capturing profiles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33499
diff changeset
   594
            profiles.update(iprofiles - aprofiles)
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   595
            if len(includes) + len(excludes) + len(profiles) > oldsize:
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   596
                changed = True
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   597
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   598
        profilecount = includecount = excludecount = 0
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   599
        fcounts = (0, 0, 0)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   600
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   601
        if changed:
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   602
            profilecount = len(profiles - aprofiles)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   603
            includecount = len(includes - aincludes)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   604
            excludecount = len(excludes - aexcludes)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   605
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   606
            fcounts = map(len, _updateconfigandrefreshwdir(
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   607
                repo, includes, excludes, profiles, force=force))
33371
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   608
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   609
        printchanges(repo.ui, opts, profilecount, includecount, excludecount,
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   610
                     *fcounts)
c6415195fa78 sparse: move code for importing rules from files into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33370
diff changeset
   611
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   612
def updateconfig(repo, pats, opts, include=False, exclude=False, reset=False,
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   613
                 delete=False, enableprofile=False, disableprofile=False,
33685
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   614
                 force=False, usereporootpaths=False):
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   615
    """Perform a sparse config update.
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   616
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   617
    Only one of the actions may be performed.
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   618
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   619
    The new config is written out and a working directory refresh is performed.
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   620
    """
33375
df6dd6d536bb sparse: clean up updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33374
diff changeset
   621
    with repo.wlock():
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   622
        raw = repo.vfs.tryread('sparse')
38838
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   623
        oldinclude, oldexclude, oldprofiles = parseconfig(repo.ui, raw,
8fe62ad9f4ff sparse: add an action argument to parseconfig()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 37576
diff changeset
   624
                                                          'sparse')
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   625
33376
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   626
        if reset:
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   627
            newinclude = set()
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   628
            newexclude = set()
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   629
            newprofiles = set()
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   630
        else:
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   631
            newinclude = set(oldinclude)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   632
            newexclude = set(oldexclude)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   633
            newprofiles = set(oldprofiles)
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   634
33683
7dcb517122f9 sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents: 33556
diff changeset
   635
        if any(os.path.isabs(pat) for pat in pats):
7dcb517122f9 sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents: 33556
diff changeset
   636
            raise error.Abort(_('paths cannot be absolute'))
7dcb517122f9 sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents: 33556
diff changeset
   637
33685
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   638
        if not usereporootpaths:
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   639
            # let's treat paths as relative to cwd
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   640
            root, cwd = repo.root, repo.getcwd()
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   641
            abspats = []
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   642
            for kindpat in pats:
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   643
                kind, pat = matchmod._patsplit(kindpat, None)
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   644
                if kind in matchmod.cwdrelativepatternkinds or kind is None:
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   645
                    ap = (kind + ':' if kind else '') +\
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   646
                            pathutil.canonpath(root, cwd, pat)
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   647
                    abspats.append(ap)
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   648
                else:
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   649
                    abspats.append(kindpat)
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   650
            pats = abspats
e1c56486d1aa sparse: treat paths as cwd-relative
Kostia Balytskyi <ikostia@fb.com>
parents: 33683
diff changeset
   651
33683
7dcb517122f9 sparse: properly error out when absolute paths are used
Kostia Balytskyi <ikostia@fb.com>
parents: 33556
diff changeset
   652
        if include:
33376
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   653
            newinclude.update(pats)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   654
        elif exclude:
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   655
            newexclude.update(pats)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   656
        elif enableprofile:
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   657
            newprofiles.update(pats)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   658
        elif disableprofile:
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   659
            newprofiles.difference_update(pats)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   660
        elif delete:
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   661
            newinclude.difference_update(pats)
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   662
            newexclude.difference_update(pats)
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   663
33376
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   664
        profilecount = (len(newprofiles - oldprofiles) -
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   665
                        len(oldprofiles - newprofiles))
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   666
        includecount = (len(newinclude - oldinclude) -
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   667
                        len(oldinclude - newinclude))
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   668
        excludecount = (len(newexclude - oldexclude) -
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   669
                        len(oldexclude - newexclude))
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   670
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   671
        fcounts = map(len, _updateconfigandrefreshwdir(
33556
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   672
            repo, newinclude, newexclude, newprofiles, force=force,
22371eabb3b1 sparse: add a requirement when a repository uses sparse (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33555
diff changeset
   673
            removing=reset))
33376
d5a38eae67e5 sparse: shorten try..except block in updateconfig()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33375
diff changeset
   674
33555
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   675
        printchanges(repo.ui, opts, profilecount, includecount,
6755b719048c sparse: consolidate common code for writing sparse config
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33551
diff changeset
   676
                     excludecount, *fcounts)
33374
4dc04cdf2520 sparse: move config updating function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33371
diff changeset
   677
33355
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   678
def printchanges(ui, opts, profilecount=0, includecount=0, excludecount=0,
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   679
                 added=0, dropped=0, conflicting=0):
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   680
    """Print output summarizing sparse config changes."""
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   681
    with ui.formatter('sparse', opts) as fm:
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   682
        fm.startitem()
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   683
        fm.condwrite(ui.verbose, 'profiles_added', _('Profiles changed: %d\n'),
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   684
                     profilecount)
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   685
        fm.condwrite(ui.verbose, 'include_rules_added',
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   686
                     _('Include rules changed: %d\n'), includecount)
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   687
        fm.condwrite(ui.verbose, 'exclude_rules_added',
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   688
                     _('Exclude rules changed: %d\n'), excludecount)
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   689
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   690
        # In 'plain' verbose mode, mergemod.applyupdates already outputs what
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   691
        # files are added or removed outside of the templating formatter
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   692
        # framework. No point in repeating ourselves in that case.
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   693
        if not fm.isplain():
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   694
            fm.condwrite(ui.verbose, 'files_added', _('Files added: %d\n'),
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   695
                         added)
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   696
            fm.condwrite(ui.verbose, 'files_dropped', _('Files dropped: %d\n'),
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   697
                         dropped)
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   698
            fm.condwrite(ui.verbose, 'files_conflicting',
9087f9997f42 sparse: move printing of sparse config changes function into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33354
diff changeset
   699
                         _('Files conflicting: %d\n'), conflicting)