tests/test-walkrepo.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Tue, 17 Oct 2017 21:15:31 +0200
changeset 34857 84c6b9384d6a
parent 30564 d83ca854fa21
child 37922 fa2423acb02f
permissions -rw-r--r--
log: add -L/--line-range option to follow file history by line range We add an experimental -L/--line-range option to 'hg log' taking file patterns along with a line range using the (new) FILE,FROMLINE-TOLINE syntax where FILE may be a pattern (matching exactly one file). The resulting history is similar to what the "followlines" revset except that, if --patch is specified, only diff hunks within specified line range are shown. Basically, this brings the CLI on par with what currently only exists in hgweb through line selection in "file" and "annotate" views resulting in a file log with filtered patch to only display followed line range. The option may be specified multiple times and can be combined with --rev and regular file patterns to further restrict revisions. Usage of this option requires --follow; revisions are shown in descending order and renames are followed. Only the --graph option is currently not supported. The UI is the result of a consensus from review feedback at: https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-October/106749.html The implementation spreads between commands.log() and cmdutil module. In commands.log(), the main loop may now use a "hunksfilter" factory (similar to "filematcher") that, for a given "rev", produces a filtering function for diff hunks for a given file context object. The logic to build revisions from -L/--line-range options lives in cmdutil.getloglinerangerevs() which produces "revs", "filematcher" and "hunksfilter" information. Revisions obtained by following files' line range are filtered if they do not match the revset specified by --rev option. If regular FILE arguments are passed along with -L options, both filematchers are combined into a new matcher. .. feature:: Add an experimental -L/--line-range FILE,FROMLINE-TOLINE option to 'hg log' command to follow the history of files by line range. In combination with -p/--patch option, only diff hunks within specified line range will be displayed. Feedback, especially on UX aspects, is welcome.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
     1
from __future__ import absolute_import, print_function
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
     2
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
     3
import os
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
     4
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
     5
from mercurial import (
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
     6
    hg,
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
     7
    scmutil,
28777
778d947f222e tests: alias ui as uimod in test-walkrepo
Yuya Nishihara <yuya@tcha.org>
parents: 28676
diff changeset
     8
    ui as uimod,
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
     9
    util,
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    10
)
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    11
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    12
chdir = os.chdir
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    13
mkdir = os.mkdir
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    14
pjoin = os.path.join
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    15
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    16
walkrepos = scmutil.walkrepos
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
    17
checklink = util.checklink
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    18
30564
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 28777
diff changeset
    19
u = uimod.ui.load()
16321
e1615a24b73a tests: make test-walkrepo use hg's symlink test
Matt Mackall <mpm@selenic.com>
parents: 14971
diff changeset
    20
sym = checklink('.')
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    21
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    22
hg.repository(u, 'top1', create=1)
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    23
mkdir('subdir')
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    24
chdir('subdir')
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    25
hg.repository(u, 'sub1', create=1)
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    26
mkdir('subsubdir')
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    27
chdir('subsubdir')
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    28
hg.repository(u, 'subsub1', create=1)
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    29
chdir(os.path.pardir)
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    30
if sym:
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    31
    os.symlink(os.path.pardir, 'circle')
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    32
    os.symlink(pjoin('subsubdir', 'subsub1'), 'subsub1')
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    33
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    34
def runtest():
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    35
    reposet = frozenset(walkrepos('.', followsym=True))
7494
85dc88630beb util: disable walkrepo() recursive behaviour
Patrick Mezard <pmezard@gmail.com>
parents: 7201
diff changeset
    36
    if sym and (len(reposet) != 3):
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    37
        print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    38
        print(("Found %d repositories when I should have found 3"
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    39
               % (len(reposet),)))
7494
85dc88630beb util: disable walkrepo() recursive behaviour
Patrick Mezard <pmezard@gmail.com>
parents: 7201
diff changeset
    40
    if (not sym) and (len(reposet) != 2):
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    41
        print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    42
        print(("Found %d repositories when I should have found 2"
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    43
               % (len(reposet),)))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    44
    sub1set = frozenset((pjoin('.', 'sub1'),
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    45
                         pjoin('.', 'circle', 'subdir', 'sub1')))
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    46
    if len(sub1set & reposet) != 1:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    47
        print("sub1set = %r" % (sub1set,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    48
        print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    49
        print("sub1set and reposet should have exactly one path in common.")
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    50
    sub2set = frozenset((pjoin('.', 'subsub1'),
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    51
                         pjoin('.', 'subsubdir', 'subsub1')))
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    52
    if len(sub2set & reposet) != 1:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    53
        print("sub2set = %r" % (sub2set,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    54
        print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    55
        print("sub2set and reposet should have exactly one path in common.")
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    56
    sub3 = pjoin('.', 'circle', 'top1')
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
    57
    if sym and sub3 not in reposet:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    58
        print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
    59
        print("Symbolic links are supported and %s is not in reposet" % (sub3,))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    60
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    61
runtest()
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    62
if sym:
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    63
    # Simulate not having symlinks.
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    64
    del os.path.samestat
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    65
    sym = False
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
    66
    runtest()