mercurial/rcutil.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 15 Jun 2017 00:15:52 -0700
changeset 33044 8e3021fd1a44
parent 32248 d74b0cff94a9
child 34645 75979c8d4572
permissions -rw-r--r--
strip: include phases in bundle (BC) Before this patch, unbundling a stripped changeset would make it a draft (unless the parent was secret). This meant that one would lose phase information when stripping and unbundling secret changesets. The same thing was true for public changesets. While stripping public changesets is generally rare, it's done frequently by e.g. the narrowhg extension. We also include the phases in the temporary bundle, just in case stripping were to fail after that point, so the user can still restore the repo including phase information. Before this patch, the phases were left untouched during the bundling and unbundling of the temporary bundle. Only at the end of the transaction would phasecache.filterunknown() be called to remove phase roots that were no longer valid. We now need to call that also after the first stripping, i.e. before applying the temporary bundle. Otherwise unbundling the temporary bundle will cause a read of the phase cache which has stripped changesets in the cache and that fails. Like with obsmarkers, we unconditionally include the phases in the bundle when stripping (when using bundle2, such as when generaldelta is enabled). The reason for doing that for strip but not for bundle is that strip bundles are not meant to be shared outside the repo, so we don't care as much about compatibility.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31684
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     1
# rcutil.py - utilities about config paths, special config sections etc.
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     2
#
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     3
#  Copyright Mercurial Contributors
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     4
#
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     7
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     8
from __future__ import absolute_import
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
     9
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    10
import os
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    11
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    12
from . import (
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    13
    encoding,
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    14
    pycompat,
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    15
    util,
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    16
)
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    17
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    18
if pycompat.osname == 'nt':
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    19
    from . import scmwindows as scmplatform
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    20
else:
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    21
    from . import scmposix as scmplatform
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    22
32078
bf5e13e38390 pager: use less as a fallback on Unix
Yuya Nishihara <yuya@tcha.org>
parents: 31954
diff changeset
    23
fallbackpager = scmplatform.fallbackpager
31684
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    24
systemrcpath = scmplatform.systemrcpath
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    25
userrcpath = scmplatform.userrcpath
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    26
31686
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    27
def _expandrcpath(path):
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    28
    '''path could be a file or a directory. return a list of file paths'''
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    29
    p = util.expandpath(path)
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    30
    if os.path.isdir(p):
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    31
        join = os.path.join
32248
d74b0cff94a9 osutil: proxy through util (and platform) modules (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32078
diff changeset
    32
        return [join(p, f) for f, k in util.listdir(p) if f.endswith('.rc')]
31686
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    33
    return [p]
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    34
31689
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    35
def envrcitems(env=None):
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    36
    '''Return [(section, name, value, source)] config items.
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    37
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    38
    The config items are extracted from environment variables specified by env,
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    39
    used to override systemrc, but not userrc.
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    40
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    41
    If env is not provided, encoding.environ will be used.
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    42
    '''
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    43
    if env is None:
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    44
        env = encoding.environ
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    45
    checklist = [
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    46
        ('EDITOR', 'ui', 'editor'),
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    47
        ('VISUAL', 'ui', 'editor'),
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    48
        ('PAGER', 'pager', 'pager'),
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    49
    ]
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    50
    result = []
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    51
    for envname, section, configname in checklist:
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    52
        if envname not in env:
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    53
            continue
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    54
        result.append((section, configname, env[envname], '$%s' % envname))
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    55
    return result
0be96ac9199a rcutil: add a method to convert environment variables to config items
Jun Wu <quark@fb.com>
parents: 31688
diff changeset
    56
31685
448889f9a36c rcutil: split osrcpath to return default.d paths (API)
Jun Wu <quark@fb.com>
parents: 31684
diff changeset
    57
def defaultrcpath():
448889f9a36c rcutil: split osrcpath to return default.d paths (API)
Jun Wu <quark@fb.com>
parents: 31684
diff changeset
    58
    '''return rc paths in default.d'''
31684
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    59
    path = []
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    60
    defaultpath = os.path.join(util.datapath, 'default.d')
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    61
    if os.path.isdir(defaultpath):
31686
294728f2a908 rcutil: extract rc directory listing logic
Jun Wu <quark@fb.com>
parents: 31685
diff changeset
    62
        path = _expandrcpath(defaultpath)
31684
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    63
    return path
0f8ba0bc1154 rcutil: move scmutil.*rcpath to rcutil (API)
Jun Wu <quark@fb.com>
parents:
diff changeset
    64
31687
07d62fa518a4 rcutil: rename rcpath to rccomponents (API)
Jun Wu <quark@fb.com>
parents: 31686
diff changeset
    65
def rccomponents():
31688
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    66
    '''return an ordered [(type, obj)] about where to load configs.
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    67
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    68
    respect $HGRCPATH. if $HGRCPATH is empty, only .hg/hgrc of current repo is
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    69
    used. if $HGRCPATH is not set, the platform default will be used.
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    70
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    71
    if a directory is provided, *.rc files under it will be used.
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    72
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    73
    type could be either 'path' or 'items', if type is 'path', obj is a string,
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    74
    and is the config file path. if type is 'items', obj is a list of (section,
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    75
    name, value, source) that should fill the config directly.
00e569a2da97 rcutil: let rccomponents return different types of configs (API)
Jun Wu <quark@fb.com>
parents: 31687
diff changeset
    76
    '''
31690
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31689
diff changeset
    77
    envrc = ('items', envrcitems())
d83e51654c8a rcutil: let environ override system configs (BC)
Jun Wu <quark@fb.com>
parents: 31689
diff changeset
    78
31698
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    79
    if 'HGRCPATH' in encoding.environ:
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    80
        # assume HGRCPATH is all about user configs so environments can be
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    81
        # overridden.
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    82
        _rccomponents = [envrc]
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    83
        for p in encoding.environ['HGRCPATH'].split(pycompat.ospathsep):
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    84
            if not p:
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    85
                continue
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    86
            _rccomponents.extend(('path', p) for p in _expandrcpath(p))
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    87
    else:
31699
10d88dc7c010 rcutil: extract duplicated logic to a lambda
Jun Wu <quark@fb.com>
parents: 31698
diff changeset
    88
        normpaths = lambda paths: [('path', os.path.normpath(p)) for p in paths]
10d88dc7c010 rcutil: extract duplicated logic to a lambda
Jun Wu <quark@fb.com>
parents: 31698
diff changeset
    89
        _rccomponents = normpaths(defaultrcpath() + systemrcpath())
31698
67f0377bd24b rcutil: unindent a block
Jun Wu <quark@fb.com>
parents: 31697
diff changeset
    90
        _rccomponents.append(envrc)
31699
10d88dc7c010 rcutil: extract duplicated logic to a lambda
Jun Wu <quark@fb.com>
parents: 31698
diff changeset
    91
        _rccomponents.extend(normpaths(userrcpath()))
31687
07d62fa518a4 rcutil: rename rcpath to rccomponents (API)
Jun Wu <quark@fb.com>
parents: 31686
diff changeset
    92
    return _rccomponents
31954
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31699
diff changeset
    93
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31699
diff changeset
    94
def defaultpagerenv():
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31699
diff changeset
    95
    '''return a dict of default environment variables and their values,
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31699
diff changeset
    96
    intended to be set before starting a pager.
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31699
diff changeset
    97
    '''
e518192d6bac pager: set some environment variables if they're not set
Jun Wu <quark@fb.com>
parents: 31699
diff changeset
    98
    return {'LESS': 'FRX', 'LV': '-c'}