##// END OF EJS Templates

File last commit:

r1409:c3172bc0 beta
r1493:5a3252dd merge beta
Show More
__init__.py
226 lines | 7.7 KiB | text/x-python | PythonLexer
code docs, updates
r903 # -*- coding: utf-8 -*-
"""
rhodecode.lib.indexers.__init__
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Whoosh indexing module for RhodeCode
source code cleanup: remove trailing white space, normalize file endings
r1203
code docs, updates
r903 :created_on: Aug 17, 2010
:author: marcink
source code cleanup: remove trailing white space, normalize file endings
r1203 :copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
code docs, updates
r903 :license: GPLv3, see COPYING for more details.
"""
fixed license issue #149
r1206 # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
code docs, updates
r903 # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
code docs, updates
r903 # You should have received a copy of the GNU General Public License
fixed license issue #149
r1206 # along with this program. If not, see <http://www.gnu.org/licenses/>.
Hacking for git support,and new faster repo scan
r631 import os
import sys
complete rewrite of paster commands,...
r785 import traceback
renamed project to rhodecode
r547 from os.path import dirname as dn, join as jn
Hacking for git support,and new faster repo scan
r631
#to get the rhodecode import
sys.path.append(dn(dn(dn(os.path.realpath(__file__)))))
fixes #90 + docs update
r894 from string import strip
renamed project to rhodecode
r547 from shutil import rmtree
complete rewrite of paster commands,...
r785
renamed project to rhodecode
r547 from whoosh.analysis import RegexTokenizer, LowercaseFilter, StopFilter
from whoosh.fields import TEXT, ID, STORED, Schema, FieldType
from whoosh.index import create_in, open_dir
from whoosh.formats import Characters
Hacking for git support,and new faster repo scan
r631 from whoosh.highlight import highlight, SimpleFragmenter, HtmlFormatter
renamed project to rhodecode
r547
moved LANGUAGE_EXTENSION_MAP to lib, and made whoosh indexer use the same map
r1302 from webhelpers.html.builder import escape
from sqlalchemy import engine_from_config
from vcs.utils.lazy import LazyProperty
from rhodecode.model import init_model
from rhodecode.model.scm import ScmModel
Jared Bunting
Allowing indexing job to resolve repos path on its own if not given.
r1407 from rhodecode.model.repo import RepoModel
moved LANGUAGE_EXTENSION_MAP to lib, and made whoosh indexer use the same map
r1302 from rhodecode.config.environment import load_environment
from rhodecode.lib import LANGUAGES_EXTENSIONS_MAP
from rhodecode.lib.utils import BasePasterCommand, Command, add_cache
renamed project to rhodecode
r547
#EXTENSIONS WE WANT TO INDEX CONTENT OFF
moved LANGUAGE_EXTENSION_MAP to lib, and made whoosh indexer use the same map
r1302 INDEX_EXTENSIONS = LANGUAGES_EXTENSIONS_MAP.keys()
renamed project to rhodecode
r547
#CUSTOM ANALYZER wordsplit + lowercase filter
ANALYZER = RegexTokenizer(expression=r"\w+") | LowercaseFilter()
#INDEX SCHEMA DEFINITION
SCHEMA = Schema(owner=TEXT(),
repository=TEXT(stored=True),
Added searching for file names within the repository in rhodecode
r556 path=TEXT(stored=True),
renamed project to rhodecode
r547 content=FieldType(format=Characters(ANALYZER),
scorable=True, stored=True),
modtime=STORED(), extension=TEXT(stored=True))
IDX_NAME = 'HG_INDEX'
Hacking for git support,and new faster repo scan
r631 FORMATTER = HtmlFormatter('span', between='\n<span class="break">...</span>\n')
renamed project to rhodecode
r547 FRAGMENTER = SimpleFragmenter(200)
Hacking for git support,and new faster repo scan
r631
complete rewrite of paster commands,...
r785 class MakeIndex(BasePasterCommand):
Hacking for git support,and new faster repo scan
r631
max_args = 1
min_args = 1
usage = "CONFIG_FILE"
summary = "Creates index for full text search given configuration file"
Implemented whoosh index building as paster command....
r683 group_name = "RhodeCode"
takes_config_file = -1
complete rewrite of paster commands,...
r785 parser = Command.standard_parser(verbose=True)
Hacking for git support,and new faster repo scan
r631 def command(self):
Implemented whoosh index building as paster command....
r683
complete rewrite of paster commands,...
r785 from pylons import config
add_cache(config)
engine = engine_from_config(config, 'sqlalchemy.db1.')
init_model(engine)
index_location = config['index_dir']
Updated contributors and fixed index line length
r1409 repo_location = self.options.repo_location \
if self.options.repo_location else RepoModel().repos_path
fixes issue #146
r1183 repo_list = map(strip, self.options.repo_list.split(',')) \
if self.options.repo_list else None
Hacking for git support,and new faster repo scan
r631
Implemented whoosh index building as paster command....
r683 #======================================================================
Hacking for git support,and new faster repo scan
r631 # WHOOSH DAEMON
Implemented whoosh index building as paster command....
r683 #======================================================================
Hacking for git support,and new faster repo scan
r631 from rhodecode.lib.pidlock import LockHeld, DaemonLock
from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
try:
fixes issue #197 Relative paths for pidlocks
r1354 l = DaemonLock(file=jn(dn(dn(index_location)), 'make_index.lock'))
Implemented whoosh index building as paster command....
r683 WhooshIndexingDaemon(index_location=index_location,
fixes #90 + docs update
r894 repo_location=repo_location,
repo_list=repo_list)\
Hacking for git support,and new faster repo scan
r631 .run(full_index=self.options.full_index)
l.release()
except LockHeld:
sys.exit(1)
complete rewrite of paster commands,...
r785 def update_parser(self):
self.parser.add_option('--repo-location',
action='store',
dest='repo_location',
Jared Bunting
Adding documentation for indexer's self-resolving repos location.
r1408 help="Specifies repositories location to index OPTIONAL",
complete rewrite of paster commands,...
r785 )
fixes #90 + docs update
r894 self.parser.add_option('--index-only',
action='store',
dest='repo_list',
help="Specifies a comma separated list of repositores "
"to build index on OPTIONAL",
)
complete rewrite of paster commands,...
r785 self.parser.add_option('-f',
action='store_true',
dest='full_index',
help="Specifies that index should be made full i.e"
" destroy old and build from scratch",
default=False)
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 class ResultWrapper(object):
Added searching for file names within the repository in rhodecode
r556 def __init__(self, search_type, searcher, matcher, highlight_items):
self.search_type = search_type
renamed project to rhodecode
r547 self.searcher = searcher
self.matcher = matcher
self.highlight_items = highlight_items
self.fragment_size = 200 / 2
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 @LazyProperty
def doc_ids(self):
docs_id = []
while self.matcher.is_active():
docnum = self.matcher.id()
chunks = [offsets for offsets in self.get_chunks()]
docs_id.append([docnum, chunks])
self.matcher.next()
Hacking for git support,and new faster repo scan
r631 return docs_id
renamed project to rhodecode
r547 def __str__(self):
return '<%s at %s>' % (self.__class__.__name__, len(self.doc_ids))
def __repr__(self):
return self.__str__()
def __len__(self):
return len(self.doc_ids)
def __iter__(self):
"""
Allows Iteration over results,and lazy generate content
*Requires* implementation of ``__getitem__`` method.
"""
for docid in self.doc_ids:
yield self.get_full_content(docid)
fixed issue with latest webhelpers pagination module
r1198 def __getitem__(self, key):
renamed project to rhodecode
r547 """
Slicing of resultWrapper
"""
fixed issue with latest webhelpers pagination module
r1198 i, j = key.start, key.stop
renamed project to rhodecode
r547 slice = []
for docid in self.doc_ids[i:j]:
slice.append(self.get_full_content(docid))
Hacking for git support,and new faster repo scan
r631 return slice
renamed project to rhodecode
r547
def get_full_content(self, docid):
res = self.searcher.stored_fields(docid[0])
f_path = res['path'][res['path'].find(res['repository']) \
+ len(res['repository']):].lstrip('/')
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 content_short = self.get_short_content(res, docid[1])
res.update({'content_short':content_short,
'content_short_hl':self.highlight(content_short),
'f_path':f_path})
Hacking for git support,and new faster repo scan
r631
return res
renamed project to rhodecode
r547 def get_short_content(self, res, chunks):
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 return ''.join([res['content'][chunk[0]:chunk[1]] for chunk in chunks])
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 def get_chunks(self):
"""
Smart function that implements chunking the content
but not overlap chunks so it doesn't highlight the same
Added searching for file names within the repository in rhodecode
r556 close occurrences twice.
moved LANGUAGE_EXTENSION_MAP to lib, and made whoosh indexer use the same map
r1302
:param matcher:
:param size:
renamed project to rhodecode
r547 """
memory = [(0, 0)]
for span in self.matcher.spans():
start = span.startchar or 0
end = span.endchar or 0
start_offseted = max(0, start - self.fragment_size)
end_offseted = end + self.fragment_size
Hacking for git support,and new faster repo scan
r631
renamed project to rhodecode
r547 if start_offseted < memory[-1][1]:
start_offseted = memory[-1][1]
Hacking for git support,and new faster repo scan
r631 memory.append((start_offseted, end_offseted,))
yield (start_offseted, end_offseted,)
renamed project to rhodecode
r547 def highlight(self, content, top=5):
Added searching for file names within the repository in rhodecode
r556 if self.search_type != 'content':
return ''
renamed project to rhodecode
r547 hl = highlight(escape(content),
self.highlight_items,
analyzer=ANALYZER,
fragmenter=FRAGMENTER,
formatter=FORMATTER,
top=top)
Hacking for git support,and new faster repo scan
r631 return hl