hgext/sparse.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 25 Feb 2023 01:07:44 +0100
branchstable
changeset 49686 fc8e37c380d3
parent 49631 2b8ead6bbb77
child 50829 54d3a6dc2426
permissions -rw-r--r--
dirstate: add a synchronisation point before doing a full dirstate read This will be useful to test some race conditions around the dirstate.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     1
# sparse.py - allow sparse checkouts of the working directory
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
#
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
# Copyright 2014 Facebook, Inc.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
#
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
"""allow sparse checkouts of the working directory (EXPERIMENTAL)
33290
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
     9
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    10
(This extension is not yet protected by backwards compatibility
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    11
guarantees. Any aspect may break in future releases until this
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    12
notice is removed.)
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    13
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    14
This extension allows the working directory to only consist of a
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    15
subset of files for the revision. This allows specific files or
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    16
directories to be explicitly included or excluded. Many repository
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    17
operations have performance proportional to the number of files in
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    18
the working directory. So only realizing a subset of files in the
cd1c275c9482 sparse: expand module docstring
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33289
diff changeset
    19
working directory can improve performance.
33294
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    20
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    21
Sparse Config Files
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    22
-------------------
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    23
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    24
The set of files that are part of a sparse checkout are defined by
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    25
a sparse config file. The file defines 3 things: includes (files to
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    26
include in the sparse checkout), excludes (files to exclude from the
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    27
sparse checkout), and profiles (links to other config files).
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    28
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    29
The file format is newline delimited. Empty lines and lines beginning
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    30
with ``#`` are ignored.
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    31
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    32
Lines beginning with ``%include `` denote another sparse config file
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    33
to include. e.g. ``%include tests.sparse``. The filename is relative
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    34
to the repository root.
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    35
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    36
The special lines ``[include]`` and ``[exclude]`` denote the section
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    37
for includes and excludes that follow, respectively. It is illegal to
33551
1d1779734c99 sparse: require [section] in sparse config files (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33496
diff changeset
    38
have ``[include]`` after ``[exclude]``.
33294
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    39
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    40
Non-special lines resemble file patterns to be added to either includes
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    41
or excludes. The syntax of these lines is documented by :hg:`help patterns`.
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    42
Patterns are interpreted as ``glob:`` by default and match against the
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    43
root of the repository.
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    44
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    45
Exclusion patterns take precedence over inclusion patterns. So even
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    46
if a file is explicitly included, an ``[exclude]`` entry can remove it.
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    47
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    48
For example, say you have a repository with 3 directories, ``frontend/``,
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    49
``backend/``, and ``tools/``. ``frontend/`` and ``backend/`` correspond
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    50
to different projects and it is uncommon for someone working on one
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    51
to need the files for the other. But ``tools/`` contains files shared
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    52
between both projects. Your sparse config files may resemble::
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    53
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    54
  # frontend.sparse
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    55
  frontend/**
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    56
  tools/**
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    57
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    58
  # backend.sparse
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    59
  backend/**
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    60
  tools/**
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    61
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    62
Say the backend grows in size. Or there's a directory with thousands
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    63
of files you wish to exclude. You can modify the profile to exclude
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    64
certain files::
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    65
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    66
  [include]
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    67
  backend/**
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    68
  tools/**
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    69
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    70
  [exclude]
a5921ad2eb99 sparse: document config file format
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33293
diff changeset
    71
  tools/tests/**
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    72
"""
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    73
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    74
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    75
from mercurial.i18n import _
43087
66f2cc210a29 py3: manually import pycompat.setattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    76
from mercurial.pycompat import setattr
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    77
from mercurial import (
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
    78
    cmdutil,
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    79
    commands,
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    80
    error,
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    81
    extensions,
35925
7625b4f7db70 cmdutil: split functions of log-like commands to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35203
diff changeset
    82
    logcmdutil,
45580
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45568
diff changeset
    83
    merge as mergemod,
35203
d8d06a930d60 py3: use byteskwargs in sparse.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33711
diff changeset
    84
    pycompat,
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    85
    registrar,
33297
ba5d89774db6 sparse: move config parsing into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33296
diff changeset
    86
    sparse,
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    87
    util,
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    88
)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    89
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    90
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    91
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    92
# be specifying the version(s) of Mercurial they are tested with, or
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    93
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    94
testedwith = b'ships-with-hg-core'
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    95
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    96
cmdtable = {}
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    97
command = registrar.command(cmdtable)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    98
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
    99
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   100
def extsetup(ui):
33299
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
   101
    sparse.enabled = True
41448fc51510 sparse: variable to track if sparse is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33298
diff changeset
   102
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   103
    _setupclone(ui)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   104
    _setuplog(ui)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   105
    _setupadd(ui)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   106
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   107
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   108
def replacefilecache(cls, propname, replacement):
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   109
    """Replace a filecache property with a new class. This allows changing the
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   110
    cache invalidation condition."""
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   111
    origcls = cls
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   112
    assert callable(replacement)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   113
    while cls is not object:
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   114
        if propname in cls.__dict__:
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   115
            orig = cls.__dict__[propname]
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   116
            setattr(cls, propname, replacement(orig))
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   117
            break
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   118
        cls = cls.__bases__[0]
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   119
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   120
    if cls is object:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   121
        raise AttributeError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   122
            _(b"type '%s' has no property '%s'") % (origcls, propname)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   123
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   124
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   125
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   126
def _setuplog(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   127
    entry = commands.table[b'log|history']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   128
    entry[1].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   129
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
            b'sparse',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   132
            None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
            b"limit to changesets affecting the sparse checkout",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   134
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   135
    )
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   136
45568
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 44470
diff changeset
   137
    def _initialrevs(orig, repo, wopts):
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 44470
diff changeset
   138
        revs = orig(repo, wopts)
c1d0f83d62c4 log: introduce struct that carries log traversal options
Yuya Nishihara <yuya@tcha.org>
parents: 44470
diff changeset
   139
        if wopts.opts.get(b'sparse'):
33320
153456f02426 sparse: move function for resolving sparse matcher into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33319
diff changeset
   140
            sparsematch = sparse.matcher(repo)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   141
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   142
            def ctxmatch(rev):
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   143
                ctx = repo[rev]
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   144
                return any(f for f in ctx.files() if sparsematch(f))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   145
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   146
            revs = revs.filter(ctxmatch)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   147
        return revs
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   148
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   149
    extensions.wrapfunction(logcmdutil, b'_initialrevs', _initialrevs)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   150
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   151
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   152
def _clonesparsecmd(orig, ui, repo, *args, **opts):
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   153
    include = opts.get('include')
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   154
    exclude = opts.get('exclude')
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   155
    enableprofile = opts.get('enable_profile')
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43087
diff changeset
   156
    narrow_pat = opts.get('narrow')
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   157
41148
8eaf693b1409 sparse: don't enable on clone if it was a narrow clone
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40295
diff changeset
   158
    # if --narrow is passed, it means they are includes and excludes for narrow
8eaf693b1409 sparse: don't enable on clone if it was a narrow clone
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40295
diff changeset
   159
    # clone
8eaf693b1409 sparse: don't enable on clone if it was a narrow clone
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 40295
diff changeset
   160
    if not narrow_pat and (include or exclude or enableprofile):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   161
45580
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45568
diff changeset
   162
        def clonesparse(orig, ctx, *args, **kwargs):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   163
            sparse.updateconfig(
45580
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45568
diff changeset
   164
                ctx.repo().unfiltered(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   165
                {},
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   166
                include=include,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   167
                exclude=exclude,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   168
                enableprofile=enableprofile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   169
                usereporootpaths=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   170
            )
45580
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45568
diff changeset
   171
            return orig(ctx, *args, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   172
45580
5c8230ca37f2 merge: replace calls to hg.updaterepo() by merge.update()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45568
diff changeset
   173
        extensions.wrapfunction(mergemod, b'update', clonesparse)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   174
    return orig(ui, repo, *args, **opts)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   175
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   176
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   177
def _setupclone(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
    entry = commands.table[b'clone']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   179
    entry[1].append((b'', b'enable-profile', [], b'enable a sparse profile'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
    entry[1].append((b'', b'include', [], b'include sparse pattern'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
    entry[1].append((b'', b'exclude', [], b'exclude sparse pattern'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
    extensions.wrapcommand(commands.table, b'clone', _clonesparsecmd)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   183
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   184
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   185
def _setupadd(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   186
    entry = commands.table[b'add']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   187
    entry[1].append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   188
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   189
            b's',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   190
            b'sparse',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   191
            None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   192
            b'also include directories of added files in sparse config',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   193
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   194
    )
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   195
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   196
    def _add(orig, ui, repo, *pats, **opts):
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43087
diff changeset
   197
        if opts.get('sparse'):
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   198
            dirs = set()
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   199
            for pat in pats:
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   200
                dirname, basename = util.split(pat)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   201
                dirs.add(dirname)
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   202
            sparse.updateconfig(repo, opts, include=list(dirs))
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   203
        return orig(ui, repo, *pats, **opts)
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   204
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   205
    extensions.wrapcommand(commands.table, b'add', _add)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   206
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   207
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   208
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   209
    b'debugsparse',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   210
    [
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   211
        (
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   212
            b'I',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   213
            b'include',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   214
            [],
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   215
            _(b'include files in the sparse checkout'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   216
            _(b'PATTERN'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   217
        ),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   218
        (
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   219
            b'X',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   220
            b'exclude',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   221
            [],
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   222
            _(b'exclude files in the sparse checkout'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   223
            _(b'PATTERN'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   224
        ),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   225
        (
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   226
            b'd',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   227
            b'delete',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   228
            [],
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   229
            _(b'delete an include/exclude rule'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   230
            _(b'PATTERN'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   231
        ),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   232
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   233
            b'f',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   234
            b'force',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   235
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
            _(b'allow changing rules even with pending changes'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   237
        ),
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   238
        (
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   239
            b'',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   240
            b'enable-profile',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   241
            [],
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   242
            _(b'enables the specified profile'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   243
            _(b'PATTERN'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   244
        ),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   245
        (
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   246
            b'',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   247
            b'disable-profile',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   248
            [],
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   249
            _(b'disables the specified profile'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   250
            _(b'PATTERN'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   251
        ),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   252
        (
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   253
            b'',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   254
            b'import-rules',
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   255
            [],
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   256
            _(b'imports rules from a file'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   257
            _(b'PATTERN'),
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   258
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
        (b'', b'clear-rules', False, _(b'clears local include/exclude rules')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   260
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   261
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   262
            b'refresh',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   263
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   264
            _(b'updates the working after sparseness changes'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   265
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
        (b'', b'reset', False, _(b'makes the repo full again')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   267
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   268
    + commands.templateopts,
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   269
    _(b'[--OPTION]'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   270
    helpbasic=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   271
)
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   272
def debugsparse(ui, repo, **opts):
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   273
    """make the current checkout sparse, or edit the existing checkout
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   274
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   275
    The sparse command is used to make the current checkout sparse.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   276
    This means files that don't meet the sparse condition will not be
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   277
    written to disk, or show up in any working copy operations. It does
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   278
    not affect files in history in any way.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   279
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   280
    Passing no arguments prints the currently applied sparse rules.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   281
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   282
    --include and --exclude are used to add and remove files from the sparse
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   283
    checkout. The effects of adding an include or exclude rule are applied
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   284
    immediately. If applying the new rule would cause a file with pending
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   285
    changes to be added or removed, the command will fail. Pass --force to
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   286
    force a rule change even with pending changes (the changes on disk will
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   287
    be preserved).
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   288
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   289
    --delete removes an existing include/exclude rule. The effects are
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   290
    immediate.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   291
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   292
    --refresh refreshes the files on disk based on the sparse rules. This is
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   293
    only necessary if .hg/sparse was changed by hand.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   294
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   295
    --enable-profile and --disable-profile accept a path to a .hgsparse file.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   296
    This allows defining sparse checkouts and tracking them inside the
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   297
    repository. This is useful for defining commonly used sparse checkouts for
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   298
    many people to use. As the profile definition changes over time, the sparse
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   299
    checkout will automatically be updated appropriately, depending on which
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   300
    changeset is checked out. Changes to .hgsparse are not applied until they
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   301
    have been committed.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   302
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   303
    --import-rules accepts a path to a file containing rules in the .hgsparse
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   304
    format, allowing you to add --include, --exclude and --enable-profile rules
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   305
    in bulk. Like the --include, --exclude and --enable-profile switches, the
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   306
    changes are applied immediately.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   307
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   308
    --clear-rules removes all local include and exclude rules, while leaving
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   309
    any enabled profiles in place.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   310
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   311
    Returns 0 if editing the sparse checkout succeeds.
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   312
    """
35203
d8d06a930d60 py3: use byteskwargs in sparse.py
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33711
diff changeset
   313
    opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   314
    include = opts.get(b'include')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   315
    exclude = opts.get(b'exclude')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   316
    force = opts.get(b'force')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   317
    enableprofile = opts.get(b'enable_profile')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   318
    disableprofile = opts.get(b'disable_profile')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
    importrules = opts.get(b'import_rules')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
    clearrules = opts.get(b'clear_rules')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
    delete = opts.get(b'delete')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
    refresh = opts.get(b'refresh')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
    reset = opts.get(b'reset')
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   324
    action = cmdutil.check_at_most_one_arg(
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   325
        opts, b'import_rules', b'clear_rules', b'refresh'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   326
    )
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   327
    updateconfig = bool(
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   328
        include or exclude or delete or reset or enableprofile or disableprofile
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   329
    )
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   330
    count = sum([updateconfig, bool(action)])
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   331
    if count > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   332
        raise error.Abort(_(b"too many flags specified"))
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   333
49357
216f273b6b30 sparse: start moving away from the global variable for detection of usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48966
diff changeset
   334
    # enable sparse on repo even if the requirements is missing.
216f273b6b30 sparse: start moving away from the global variable for detection of usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48966
diff changeset
   335
    repo._has_sparse = True
216f273b6b30 sparse: start moving away from the global variable for detection of usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48966
diff changeset
   336
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   337
    if count == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   338
        if repo.vfs.exists(b'sparse'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   339
            ui.status(repo.vfs.read(b"sparse") + b"\n")
33304
3e1accab7447 sparse: move some temporary includes functions into core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33303
diff changeset
   340
            temporaryincludes = sparse.readtemporaryincludes(repo)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   341
            if temporaryincludes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   342
                ui.status(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
                    _(b"Temporarily Included Files (for merge/rebase):\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   344
                )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   345
                ui.status((b"\n".join(temporaryincludes) + b"\n"))
41988
f9344d04909e debugsparse: abort if the repository is not sparse instead of ui.status()
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41687
diff changeset
   346
            return
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   347
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   348
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   349
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   350
                    b'the debugsparse command is only supported on'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   351
                    b' sparse repositories'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   352
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   353
            )
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   354
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   355
    if updateconfig:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   356
        sparse.updateconfig(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   357
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   358
            opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   359
            include=include,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   360
            exclude=exclude,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   361
            reset=reset,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   362
            delete=delete,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   363
            enableprofile=enableprofile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   364
            disableprofile=disableprofile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   365
            force=force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   366
        )
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   367
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   368
    if importrules:
48747
a6efb9180764 sparse: rework debugsparse's interface
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 47945
diff changeset
   369
        sparse.importfromfiles(repo, opts, importrules, force=force)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   370
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   371
    if clearrules:
33354
4695f1829045 sparse: move code for clearing rules to core
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33353
diff changeset
   372
        sparse.clearrules(repo, force=force)
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   373
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   374
    if refresh:
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   375
        try:
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   376
            wlock = repo.wlock()
49631
2b8ead6bbb77 sparse: fix a py2 based usage of `map()`
Matt Harbison <matt_harbison@yahoo.com>
parents: 49363
diff changeset
   377
            fcounts = pycompat.maplist(
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   378
                len,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   379
                sparse.refreshwdir(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   380
                    repo, repo.status(), sparse.matcher(repo), force=force
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   381
                ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   382
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   383
            sparse.printchanges(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   384
                ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   385
                opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   386
                added=fcounts[0],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   387
                dropped=fcounts[1],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   388
                conflicting=fcounts[2],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42472
diff changeset
   389
            )
33289
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   390
        finally:
abd7dedbaa36 sparse: vendor Facebook-developed extension
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   391
            wlock.release()
49357
216f273b6b30 sparse: start moving away from the global variable for detection of usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48966
diff changeset
   392
216f273b6b30 sparse: start moving away from the global variable for detection of usage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48966
diff changeset
   393
    del repo._has_sparse