Re: [PATCH 3 of 3] revset: add a changes(file, fromline, toline[, rev]) revset

2016-12-02 Thread Jun Wu
Excerpts from Yuya Nishihara's message of 2016-12-02 23:19:56 +0900:
> On Fri, 2 Dec 2016 08:38:53 +0100, Denis Laxalde wrote:
> > Yuya Nishihara a écrit :
> > > On Mon, 28 Nov 2016 11:12:35 +0100, Denis Laxalde wrote:
> > >> Denis Laxalde a écrit :
> > >>> # HG changeset patch
> > >>> # User Denis Laxalde 
> > >>> # Date 1480086890 -3600
> > >>> #  Fri Nov 25 16:14:50 2016 +0100
> > >>> # Node ID e88a112076294d9b1639a486e7ef0ec9c1ffa660
> > >>> # Parent  6dd93ae7b35002531308444c87dcf47beb773648
> > >>> # EXP-Topic linerange-log/revset
> > >>> revset: add a changes(file, fromline, toline[, rev]) revset
> > >>
> > >> This is the first step of my work (in progress) about adding a "line
> > >> range" filtering for log discussed in
> > >> https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-October/088687.html
> > >>  .
> > >>
> > >> I would have liked to add tests for this revset but it seems to me that
> > >> the current test repositories are not complex enough for this: I'd need
> > >> files with significant content and changes in this content. Any idea how
> > >> I could do this?
> > >
> > > Maybe we can share some bits with test-annotate.t ?
> > 
> > Repositories in these are indeed more complex. So should I append tests
> > in this file or reproduce similar repositories in test-revset.t?
> 
> I *think* adding tests to test-annotate.t is okay since the behavior of
> changes() revset is somewhat similar to annotate.
> 
> Jun might have more data sets for his fastannotate extension?

fastannotate basically reuses the original annotate test cases for the core
algorithm, and with some additional tests about extra features like
wireprotocol, --deleted etc.

Because fastannotate works differently from the vanilla algorithm: it tracks
'!' blocks instead of '=' blocks and it deals with p1 and p2 differently,
the output is slightly different:

bitbucket.org/facebook/hg-experimental/src/27a94a/tests/test-fastannotate-hg.t?#test-fastannotate-hg.t-229
bitbucket.org/facebook/hg-experimental/src/27a94a/tests/test-fastannotate-hg.t?#test-fastannotate-hg.t-324

With the recent bdiff change, fastannotate became more different from the
vanilla annotate:

https://bitbucket.org/facebook/hg-experimental/commits/11c9b13fc1ef778c5636ac04e3812a06c0e4a08f
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


Re: [PATCH 3 of 3] revset: add a changes(file, fromline, toline[, rev]) revset

2016-12-01 Thread Denis Laxalde

Yuya Nishihara a écrit :

On Mon, 28 Nov 2016 11:12:35 +0100, Denis Laxalde wrote:

Denis Laxalde a écrit :

# HG changeset patch
# User Denis Laxalde 
# Date 1480086890 -3600
#  Fri Nov 25 16:14:50 2016 +0100
# Node ID e88a112076294d9b1639a486e7ef0ec9c1ffa660
# Parent  6dd93ae7b35002531308444c87dcf47beb773648
# EXP-Topic linerange-log/revset
revset: add a changes(file, fromline, toline[, rev]) revset


This is the first step of my work (in progress) about adding a "line
range" filtering for log discussed in
https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-October/088687.html.

I would have liked to add tests for this revset but it seems to me that
the current test repositories are not complex enough for this: I'd need
files with significant content and changes in this content. Any idea how
I could do this?


Maybe we can share some bits with test-annotate.t ?




Repositories in these are indeed more complex. So should I append tests
in this file or reproduce similar repositories in test-revset.t?
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


Re: [PATCH 3 of 3] revset: add a changes(file, fromline, toline[, rev]) revset

2016-11-30 Thread Yuya Nishihara
On Mon, 28 Nov 2016 11:12:35 +0100, Denis Laxalde wrote:
> Denis Laxalde a écrit :
> > # HG changeset patch
> > # User Denis Laxalde 
> > # Date 1480086890 -3600
> > #  Fri Nov 25 16:14:50 2016 +0100
> > # Node ID e88a112076294d9b1639a486e7ef0ec9c1ffa660
> > # Parent  6dd93ae7b35002531308444c87dcf47beb773648
> > # EXP-Topic linerange-log/revset
> > revset: add a changes(file, fromline, toline[, rev]) revset
> 
> This is the first step of my work (in progress) about adding a "line
> range" filtering for log discussed in
> https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-October/088687.html.
> 
> I would have liked to add tests for this revset but it seems to me that
> the current test repositories are not complex enough for this: I'd need
> files with significant content and changes in this content. Any idea how
> I could do this?

Maybe we can share some bits with test-annotate.t ?
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


Re: [PATCH 3 of 3] revset: add a changes(file, fromline, toline[, rev]) revset

2016-11-28 Thread Denis Laxalde

Denis Laxalde a écrit :

# HG changeset patch
# User Denis Laxalde 
# Date 1480086890 -3600
#  Fri Nov 25 16:14:50 2016 +0100
# Node ID e88a112076294d9b1639a486e7ef0ec9c1ffa660
# Parent  6dd93ae7b35002531308444c87dcf47beb773648
# EXP-Topic linerange-log/revset
revset: add a changes(file, fromline, toline[, rev]) revset


This is the first step of my work (in progress) about adding a "line
range" filtering for log discussed in
https://www.mercurial-scm.org/pipermail/mercurial-devel/2016-October/088687.html.

I would have liked to add tests for this revset but it seems to me that
the current test repositories are not complex enough for this: I'd need
files with significant content and changes in this content. Any idea how
I could do this?
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


[PATCH 3 of 3] revset: add a changes(file, fromline, toline[, rev]) revset

2016-11-28 Thread Denis Laxalde
# HG changeset patch
# User Denis Laxalde 
# Date 1480086890 -3600
#  Fri Nov 25 16:14:50 2016 +0100
# Node ID e88a112076294d9b1639a486e7ef0ec9c1ffa660
# Parent  6dd93ae7b35002531308444c87dcf47beb773648
# EXP-Topic linerange-log/revset
revset: add a changes(file, fromline, toline[, rev]) revset

This relies on `filectx.blocksancetors(fromline, toline)`.

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -18,6 +18,7 @@ from . import (
 error,
 hbisect,
 match as matchmod,
+mdiff,
 node,
 obsolete as obsmod,
 parser,
@@ -1350,6 +1351,34 @@ def modifies(repo, subset, x):
 pat = getstring(x, _("modifies requires a pattern"))
 return checkstatus(repo, subset, pat, 0)
 
+@predicate('changes(file, fromline, toline, rev)', safe=True)
+def changes(repo, subset, x):
+"""Changesets modifying 'file' in line range ('fromline', 'toline').
+
+Line range corresponds to 'file' content at 'rev'. If rev is not
+specified, working directory's parent is used.
+"""
+args = map(getsymbol,
+   getargs(x, 3, 4, _('changes takes at least three arguments')))
+fname = args[0]
+
+try:
+fromline, toline = map(int, args[1:3])
+except ValueError:
+raise error.ParseError(_('line range bounds must be integers'))
+if toline - fromline < 0:
+raise error.Abort("line range must be positive")
+if fromline < 1:
+raise error.Abort("fromline must be > 0")
+fromline -= 1
+
+rev = '.'
+if len(args) == 4:
+rev = args[3]
+fctx = repo[rev].filectx(fname)
+revs = (c.rev() for c in fctx.blockancestors(fromline, toline))
+return subset & generatorset(revs, iterasc=False)
+
 @predicate('named(namespace)')
 def named(repo, subset, x):
 """The changesets in a given namespace.
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel