D1678: revset: pass pre-optimized tree in revset.matchany()

2017-12-19 Thread pulkit (Pulkit Goyal)
pulkit abandoned this revision.
pulkit added a comment.


  In https://phab.mercurial-scm.org/D1678#29063, @yuja wrote:
  
  > > Since we are calling them at each command level, it will be better to 
call unhidehashlikerevs() in `scmutil.revrange|revsingle`.
  >
  > I thought about that, but `scmutil.rev*()` would have to return new 
filtered `repo`
  >  object, which didn't seem nice. And mutating a given `repo` argument has 
the
  >  original problem, when to discard unhidden revisions. So my conclusion was 
a
  >  separate function.
  >
  > > We will still need to store the filtername in dispatch and then later on
  > >  decide on basis of that whether we want to uhide things.
  >
  > Doesn't each command know whether it should unhide or not?
  
  
  Thanks for all the ideas, I have send the new series as 
https://phab.mercurial-scm.org/D1730 - https://phab.mercurial-scm.org/D1735 as 
they are entirely different changesets.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1678

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1678: revset: pass pre-optimized tree in revset.matchany()

2017-12-15 Thread yuja (Yuya Nishihara)
yuja added a comment.


  > Since we are calling them at each command level, it will be better to call 
unhidehashlikerevs() in `scmutil.revrange|revsingle`.
  
  I thought about that, but `scmutil.rev*()` would have to return new filtered 
`repo`
  object, which didn't seem nice. And mutating a given `repo` argument has the
  original problem, when to discard unhidden revisions. So my conclusion was a
  separate function.
  
  > We will still need to store the filtername in dispatch and then later on
  >  decide on basis of that whether we want to uhide things.
  
  Doesn't each command know whether it should unhide or not?

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1678

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1678: revset: pass pre-optimized tree in revset.matchany()

2017-12-14 Thread pulkit (Pulkit Goyal)
pulkit added a comment.


  In https://phab.mercurial-scm.org/D1678#28729, @yuja wrote:
  
  > In https://phab.mercurial-scm.org/D1678#28686, @pulkit wrote:
  >
  > > @yuja am I headed in the right direction? (I am not sure about whether 
the API's I changed are used by extensions or not)
  >
  >
  > Sort of, but I was thinking of a simpler one. Just parse specs twice, which 
isn't
  >  costly operation.
  >
  >   def unhidehashlikerevs(repo, specs, allowhidden|warnhidden):
  >   if not repo.filtername:
  >   return repo
  >   syms = set()
  >   for spec in specs:
  >   try:
  >   tree = revsetlang.parse(spec)
  >   except ParseError:
  >   continue  # will be reported later by scmutil.revrange()
  >   syms.update(revsetlang.hashlikesymbols(tree))
  >   if not syms:
  >   return repo
  >   pinned = perhaps_need_to_convert_to_nodes_or_revs?(syms)
  >   # filtered repo with the given extra pinned revisions; no idea if 
this is an ideal API
  >   return repo.filtered(repo.filtername, pinned)
  >
  >
  > This allows us to get rid of an intermediate state where a repo is flagged 
as
  >  "visible-", but "" isn't added yet.
  >
  > We can apply this function at dispatch:
  >
  >   def _dispatch(req):
  >   ...
  >   if repo:
  >   ui = repo.ui
  >   if options['hidden']:
  >   repo = repo.unfiltered()
  >   else:
  >   # perhaps we'll need a registrar flag to get 
arguments taking revspecs
  >   repo = scmutil.unhidehashlikerevs(repo, 
cmdoptions.get('rev', []))
  >
  >
  > or simply at each command:
  >
  >   def diff(...):
  >   ...
  >   repo = scmutil.unhidehashlikerevs(repo, changesets, 'allowhidden')
  >   revs = scmutil.revrange(repo, changesets)
  >
  
  
  I like your idea. Thanks for it. After some hacking, I think we should call 
`scmutil.unhidehashlikerevs()` from each command level because at dispatch 
level we are not sure what `revs` are, some commands don't need `--rev` to take 
a rev like `hg export`. Since we are calling them at each command level, it 
will be better to call unhidehashlikerevs() in `scmutil.revrange|revsingle`. We 
will still need to store the filtername in dispatch and then later on decide on 
basis of that whether we want to uhide things.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1678

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1678: revset: pass pre-optimized tree in revset.matchany()

2017-12-13 Thread yuja (Yuya Nishihara)
yuja added a comment.


  In https://phab.mercurial-scm.org/D1678#28686, @pulkit wrote:
  
  > @yuja am I headed in the right direction? (I am not sure about whether the 
API's I changed are used by extensions or not)
  
  
  Sort of, but I was thinking of a simpler one. Just parse specs twice, which 
isn't
  costly operation.
  
def unhidehashlikerevs(repo, specs, allowhidden|warnhidden):
if not repo.filtername:
return repo
syms = set()
for spec in specs:
try:
tree = revsetlang.parse(spec)
except ParseError:
continue  # will be reported later by scmutil.revrange()
syms.update(revsetlang.hashlikesymbols(tree))
if not syms:
return repo
pinned = perhaps_need_to_convert_to_nodes_or_revs?(syms)
# filtered repo with the given extra pinned revisions; no idea if this 
is an ideal API
return repo.filtered(repo.filtername, pinned)
  
  This allows us to get rid of an intermediate state where a repo is flagged as
  "visible-", but "" isn't added yet.
  
  We can apply this function at dispatch:
  
def _dispatch(req):
...
if repo:
ui = repo.ui
if options['hidden']:
repo = repo.unfiltered()
else:
# perhaps we'll need a registrar flag to get arguments 
taking revspecs
repo = scmutil.unhidehashlikerevs(repo, 
cmdoptions.get('rev', []))
  
  or simply at each command:
  
def diff(...):
...
repo = scmutil.unhidehashlikerevs(repo, changesets, 'allowhidden')
revs = scmutil.revrange(repo, changesets)

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1678

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1678: revset: pass pre-optimized tree in revset.matchany()

2017-12-12 Thread pulkit (Pulkit Goyal)
pulkit added a subscriber: yuja.
pulkit added a comment.


  @yuja am I headed in the right direction? (I am not sure about whether the 
API's I changed are used by extensions or not)

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1678

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D1678: revset: pass pre-optimized tree in revset.matchany()

2017-12-12 Thread pulkit (Pulkit Goyal)
pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This is a part of series where we move logic around so that we can get the 
tree
  at a higher level function such as repo.anyrevs(). This will help us in 
reading
  the tree and doing certain operations like updating visibility exceptions on
  base of that.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1678

AFFECTED FILES
  mercurial/localrepo.py
  mercurial/revset.py

CHANGE DETAILS

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -2163,26 +2163,25 @@
 
 def match(ui, spec, repo=None):
 """Create a matcher for a single revision spec"""
-return matchany(ui, [spec], repo=repo)
+
+if not specs:
+return emptymatcher
+if not all(specs):
+raise error.ParseError(_("empty query"))
+
+tree = buildtree([spec], repo)
+return matchany(ui, tree, repo=repo)
 
 def emptymatcher(repo, subset=None):
 """ Matcher for empty specs """
 return baseset()
 
-def matchany(ui, specs, repo=None, localalias=None):
-"""Create a matcher that will include any revisions matching one of the
-given specs
+def matchany(ui, tree, repo=None, localalias=None):
+"""Create a matcher for the tree
 
 If localalias is not None, it is a dict {name: definitionstring}. It takes
 precedence over [revsetalias] config section.
 """
-if not specs:
-return emptymatcher
-if not all(specs):
-raise error.ParseError(_("empty query"))
-
-tree = buildtree(specs, repo)
-
 aliases = []
 warn = None
 if ui:
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -804,11 +804,19 @@
 definitions overriding user aliases, set ``localalias`` to
 ``{name: definitionstring}``.
 '''
+
+if not specs:
+return revset.emptymatcher(self)
+if not all(specs):
+raise error.ParseError(_("empty query"))
+
 if user:
-m = revset.matchany(self.ui, specs, repo=self,
+tree = revset.buildtree(specs, self)
+m = revset.matchany(self.ui, tree, repo=self,
 localalias=localalias)
 else:
-m = revset.matchany(None, specs, localalias=localalias)
+tree = revset.buildtree(specs)
+m = revset.matchany(None, tree, localalias=localalias)
 return m(self)
 
 def url(self):



To: pulkit, #hg-reviewers
Cc: mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel