[PATCH 2 of 6 V3] hgweb: add revsetsearch() function when query can be parsed as a revset
Alexander Plavin
alexander at plav.in
Tue Aug 27 07:34:51 UTC 2013
26.08.2013, 18:47, "Augie Fackler" <raf at durin42.com>:
> On Thu, Aug 22, 2013 at 07:11:13PM +0400, Alexander Plavin wrote:
>
>> # HG changeset patch
>> # User Alexander Plavin <alexander at plav.in>
>> # Date 1375823774 -14400
>> # Wed Aug 07 01:16:14 2013 +0400
>> # Node ID c9ded075156603c15bb0a71273d2babbd19ab6fb
>> # Parent f32bf1774cc3e6cd7ee99a7be2724daa23223a98
>> hgweb: add revsetsearch() function when query can be parsed as a revset
>>
>> This function is used when all the conditions are met:
>> - 'reverse(%s)' % query string can be parsed to a revset tree
>> - this tree has depth more than two, i.e. the query has some part of
>> revset syntax used
>> - the repo can be actually matched against this tree, i.e. it has only existent
>> function/operators and revisions/tags/bookmarks specified are correct
>>
>> Otherwise keywordsearch() or revsearch() functions are used as before.
>>
>> Add several new tests for different parsing conditions and exception handling.
>
> Looks great.
>
>> diff -r f32bf1774cc3 -r c9ded0751566 mercurial/hgweb/webcommands.py
>> --- a/mercurial/hgweb/webcommands.py Fri Aug 09 22:52:58 2013 +0400
>> +++ b/mercurial/hgweb/webcommands.py Wed Aug 07 01:16:14 2013 +0400
>> @@ -16,6 +16,8 @@
>> from mercurial import help as helpmod
>> from mercurial import scmutil
>> from mercurial.i18n import _
>> +from mercurial.error import ParseError, RepoLookupError, Abort
>> +from mercurial import parser, revset
>>
>> # __all__ is populated with the allowed commands. Be sure to add to it if
>> # you're adding a new command, or the new command won't work.
>> @@ -141,18 +143,50 @@
>>
>> yield ctx
>>
>> + def revsetsearch(revdef):
>> + revs = revset.match(web.repo.ui, revdef)(web.repo, list(web.repo))
>> + for r in revs:
>> + yield web.repo[r]
>> +
>> searchfuncs = {
>> 'rev': revsearch,
>> 'kw': keywordsearch,
>> + 'revset': revsetsearch,
>> }
>>
>> def getsearchmode(query):
>> try:
>> ctx = web.repo[query]
>> except (error.RepoError, error.LookupError):
>> + # query is not an exact revision pointer, need to
>> + # decide if it's a revset expession or keywords
>> + pass
>> + else:
>> + return 'rev', ctx
>
> Why not just return from the try block instead of using try/else?
try/except/else here is actually introduced in an earlier patch (https://hg.plav.in/hg_fork/rev/5407b1e23932), and as for me it looks more symmetrical ('except' and 'else' branches), thus easier to read. Am I wrong here?
>
>> +
>> + revdef = 'reverse(%s)' % query
>> + try:
>> + p = parser.parser(revset.tokenize, revset.elements)
>> + tree, pos = p.parse(revdef)
>> + except ParseError:
>> + # can't parse to a revset tree
>> + return 'kw', query
>> +
>> + if revset.depth(tree) <= 2:
>> + # no revset syntax used
>> + return 'kw', query
>> +
>> + mfunc = revset.match(None, revdef)
>> + try:
>> + # try running against empty subset
>> + mfunc(web.repo, [])
>> + # ParseError: wrongly placed tokens, wrongs arguments, etc
>> + # RepoLookupError: no such revision, e.g. in 'revision:'
>> + # Abort: bookmark/tag not exists
>> + except (ParseError, RepoLookupError, Abort):
>> return 'kw', query
>> else:
>> - return 'rev', ctx
>> + return 'revset', revdef
>>
>> def changelist(**map):
>> count = 0
>> diff -r f32bf1774cc3 -r c9ded0751566 tests/test-hgweb-commands.t
>> --- a/tests/test-hgweb-commands.t Fri Aug 09 22:52:58 2013 +0400
>> +++ b/tests/test-hgweb-commands.t Wed Aug 07 01:16:14 2013 +0400
>> @@ -537,6 +537,101 @@
>> $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=stable&style=raw' | grep 'revision:'
>> revision: 2
>>
>> +Search with revset syntax
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=tip^&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "tip^"
>> +
>> + changeset: 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
>> + revision: 2
>> + user: test
>> + date: Thu, 01 Jan 1970 00:00:00 +0000
>> + summary: branch
>> + branch: stable
>> +
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=last(all(),2)^&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "last(all(),2)^"
>> +
>> + changeset: 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
>> + revision: 2
>> + user: test
>> + date: Thu, 01 Jan 1970 00:00:00 +0000
>> + summary: branch
>> + branch: stable
>> +
>> + changeset: a4f92ed23982be056b9852de5dfe873eaac7f0de
>> + revision: 1
>> + user: test
>> + date: Thu, 01 Jan 1970 00:00:00 +0000
>> + summary: Added tag 1.0 for changeset 2ef0ac749a14
>> + branch: default
>> +
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=last(all(,2)^&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "last(all(,2)^"
>> +
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=last(al(),2)^&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "last(al(),2)^"
>> +
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=bookmark(anotherthing)&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "bookmark(anotherthing)"
>> +
>> + changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
>> + revision: 0
>> + user: test
>> + date: Thu, 01 Jan 1970 00:00:00 +0000
>> + summary: base
>> + tag: 1.0
>> + bookmark: anotherthing
>> +
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=bookmark(abc)&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "bookmark(abc)"
>> +
>> +
>> + $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=deadbeef:&style=raw'
>> + 200 Script output follows
>> +
>> +
>> + # HG changesets search
>> + # Node ID cad8025a2e87f88c06259790adfa15acb4080123
>> + # Query "deadbeef:"
>> +
>> +
>> +
>> File-related
>>
>> $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/1/foo/?style=raw'
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list