##// END OF EJS Templates
Added tag v1.3.6 for changeset edfff9f37916
Added tag v1.3.6 for changeset edfff9f37916

File last commit:

r2165:dc2584ba merge default
r2301:9d097c25 default
Show More
__init__.py
227 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
2012 copyrights
r1824 :copyright: (C) 2010-2012 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
Whoosh logging is now controlled by the .ini files logging setup
r2102 import logging
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
bumbed whoosh to 2.3.X series...
r1995 from whoosh.highlight import highlight, HtmlFormatter, ContextFragmenter
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 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
utils/conf...
r2109 from rhodecode.lib.utils2 import LazyProperty
from rhodecode.lib.utils import BasePasterCommand, Command, add_cache,\
load_rcextensions
renamed project to rhodecode
r547
bumbed whoosh to 2.3.X series...
r1995 # CUSTOM ANALYZER wordsplit + lowercase filter
renamed project to rhodecode
r547 ANALYZER = RegexTokenizer(expression=r"\w+") | LowercaseFilter()
#INDEX SCHEMA DEFINITION
bumbed whoosh to 2.3.X series...
r1995 SCHEMA = Schema(
owner=TEXT(),
repository=TEXT(stored=True),
path=TEXT(stored=True),
content=FieldType(format=Characters(), analyzer=ANALYZER,
scorable=True, stored=True),
modtime=STORED(),
extension=TEXT(stored=True)
)
renamed project to rhodecode
r547
IDX_NAME = 'HG_INDEX'
Hacking for git support,and new faster repo scan
r631 FORMATTER = HtmlFormatter('span', between='\n<span class="break">...</span>\n')
bumbed whoosh to 2.3.X series...
r1995 FRAGMENTER = ContextFragmenter(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):
Whoosh logging is now controlled by the .ini files logging setup
r2102 logging.config.fileConfig(self.path_to_ini_file)
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
utils/conf...
r2109 load_rcextensions(config['here'])
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 #258 RhodeCode 1.2 assumes egg folder is writable
r1540 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,
utils/conf...
r2109 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
implements #330 api method for listing nodes at particular revision...
r1810
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
bumbed whoosh to 2.3.X series...
r1995 self.fragment_size = 200
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
bumbed whoosh to 2.3.X series...
r1995 slices = []
renamed project to rhodecode
r547 for docid in self.doc_ids[i:j]:
bumbed whoosh to 2.3.X series...
r1995 slices.append(self.get_full_content(docid))
return slices
Hacking for git support,and new faster repo scan
r631
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])
bumbed whoosh to 2.3.X series...
r1995 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.
implements #330 api method for listing nodes at particular revision...
r1810
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 ''
bumbed whoosh to 2.3.X series...
r1995 hl = highlight(
text=escape(content),
terms=self.highlight_items,
analyzer=ANALYZER,
fragmenter=FRAGMENTER,
formatter=FORMATTER,
top=top
)
Hacking for git support,and new faster repo scan
r631 return hl