##// END OF EJS Templates
fixed setup.py file to use same platform as defined in main rhodecode PLATFORM_OTHERS,...
fixed setup.py file to use same platform as defined in main rhodecode PLATFORM_OTHERS, added docs for lib

File last commit:

r1217:a3b2b4b4 default
r1223:f7b24987 beta
Show More
tasks.py
404 lines | 15.4 KiB | text/x-python | PythonLexer
code docs, updates
r903 # -*- coding: utf-8 -*-
"""
rhodecode.lib.celerylib.tasks
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
code docs, updates
r903
RhodeCode task modules, containing all task that suppose to be run
by celery daemon
source code cleanup: remove trailing white space, normalize file endings
r1203
code docs, updates
r903 :created_on: Oct 6, 2010
:author: marcink
source code cleanup: remove trailing white space, normalize file endings
r1203 :copyright: (C) 2009-2011 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/>.
renamed project to rhodecode
r547 from celery.decorators import task
added fault tolerant case when celeryconfig is not present in the directory....
r555
#50 on point cache invalidation changes....
r692 import os
import traceback
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 import logging
#50 on point cache invalidation changes....
r692 from time import mktime
renamed project to rhodecode
r547 from operator import itemgetter
Celery is configured by the .ini files and run from paster now...
r776
from pylons import config
renamed project to rhodecode
r547 from pylons.i18n.translation import _
Celery is configured by the .ini files and run from paster now...
r776
from rhodecode.lib.celerylib import run_task, locked_task, str2bool
renamed project to rhodecode
r547 from rhodecode.lib.helpers import person
from rhodecode.lib.smtp_mailer import SmtpMailer
complete rewrite of paster commands,...
r785 from rhodecode.lib.utils import OrderedDict, add_cache
Celery is configured by the .ini files and run from paster now...
r776 from rhodecode.model import init_model
from rhodecode.model import meta
from rhodecode.model.db import RhodeCodeUi
Hacking for git support,and new faster repo scan
r631 from vcs.backends import get_repo
Celery is configured by the .ini files and run from paster now...
r776
from sqlalchemy import engine_from_config
#50 on point cache invalidation changes....
r692
fixed cache problem,...
r777 add_cache(config)
added fault tolerant case when celeryconfig is not present in the directory....
r555 try:
refactor codes and setup for python 2.5...
r564 import json
except ImportError:
#python 2.5 compatibility
import simplejson as json
renamed project to rhodecode
r547 __all__ = ['whoosh_index', 'get_commits_stats',
'reset_user_password', 'send_email']
Celery is configured by the .ini files and run from paster now...
r776 CELERY_ON = str2bool(config['app_conf'].get('use_celery'))
renamed project to rhodecode
r547 def get_session():
Celery is configured by the .ini files and run from paster now...
r776 if CELERY_ON:
engine = engine_from_config(config, 'sqlalchemy.db1.')
init_model(engine)
sa = meta.Session()
renamed project to rhodecode
r547 return sa
#50 on point cache invalidation changes....
r692 def get_repos_path():
sa = get_session()
q = sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
return q.ui_value
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 @task(ignore_result=True)
renamed project to rhodecode
r547 @locked_task
def whoosh_index(repo_location, full_index):
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 #log = whoosh_index.get_logger()
renamed project to rhodecode
r547 from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
Celery is configured by the .ini files and run from paster now...
r776 index_location = config['index_dir']
fixed annotation bug, added history to annotation....
r662 WhooshIndexingDaemon(index_location=index_location,
fixed cache problem,...
r777 repo_location=repo_location, sa=get_session())\
.run(full_index=full_index)
renamed project to rhodecode
r547
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 @task(ignore_result=True)
renamed project to rhodecode
r547 @locked_task
def get_commits_stats(repo_name, ts_min_y, ts_max_y):
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 try:
log = get_commits_stats.get_logger()
except:
log = logging.getLogger(__name__)
renamed project to rhodecode
r547 from rhodecode.model.db import Statistics, Repository
Code refactor for auth func, preparing for ldap support...
r699
#for js data compatibilty
author_key_cleaner = lambda k: person(k).replace('"', "")
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 commits_by_day_author_aggregate = {}
commits_by_day_aggregate = {}
#50 on point cache invalidation changes....
r692 repos_path = get_repos_path()
Hacking for git support,and new faster repo scan
r631 p = os.path.join(repos_path, repo_name)
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 repo = get_repo(p)
renamed project to rhodecode
r547
skip_date_limit = True
moved statistics parse_limit into .ini files...
r1076 parse_limit = int(config['app_conf'].get('commit_parse_limit'))
renamed project to rhodecode
r547 last_rev = 0
last_cs = None
timegetter = itemgetter('time')
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 sa = get_session()
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 dbrepo = sa.query(Repository)\
.filter(Repository.repo_name == repo_name).scalar()
cur_stats = sa.query(Statistics)\
.filter(Statistics.repository == dbrepo).scalar()
Added branch filter to repo pager...
r1105
if cur_stats is not None:
renamed project to rhodecode
r547 last_rev = cur_stats.stat_on_revision
Added branch filter to repo pager...
r1105
#return if repo is empty
renamed project to rhodecode
r547 if not repo.revisions:
return True
Code refactoring,models renames...
r629
Added branch filter to repo pager...
r1105 if last_rev == repo.get_changeset().revision and len(repo.revisions) > 1:
source code cleanup: remove trailing white space, normalize file endings
r1203 #pass silently without any work if we're not on first revision or
Code refactor for auth func, preparing for ldap support...
r699 #current state of parsing revision(from db marker) is the last revision
renamed project to rhodecode
r547 return True
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 if cur_stats:
commits_by_day_aggregate = OrderedDict(
json.loads(
cur_stats.commit_activity_combined))
commits_by_day_author_aggregate = json.loads(cur_stats.commit_activity)
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 log.debug('starting parsing %s', parse_limit)
some small fixes
r630 lmktime = mktime
some small fixes to stats function
r803 last_rev = last_rev + 1 if last_rev > 0 else last_rev
moved statistics parse_limit into .ini files...
r1076
for cs in repo[last_rev:last_rev + parse_limit]:
last_cs = cs #remember last parsed changeset
code stats speed improvments
r804 k = lmktime([cs.date.timetuple()[0], cs.date.timetuple()[1],
cs.date.timetuple()[2], 0, 0, 0, 0, 0, 0])
renamed project to rhodecode
r547 if commits_by_day_author_aggregate.has_key(author_key_cleaner(cs.author)):
try:
l = [timegetter(x) for x in commits_by_day_author_aggregate\
[author_key_cleaner(cs.author)]['data']]
time_pos = l.index(k)
except ValueError:
time_pos = False
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 if time_pos >= 0 and time_pos is not False:
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 datadict = commits_by_day_author_aggregate\
[author_key_cleaner(cs.author)]['data'][time_pos]
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 datadict["commits"] += 1
datadict["added"] += len(cs.added)
datadict["changed"] += len(cs.changed)
datadict["removed"] += len(cs.removed)
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 else:
if k >= ts_min_y and k <= ts_max_y or skip_date_limit:
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 datadict = {"time":k,
"commits":1,
"added":len(cs.added),
"changed":len(cs.changed),
"removed":len(cs.removed),
}
commits_by_day_author_aggregate\
[author_key_cleaner(cs.author)]['data'].append(datadict)
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 else:
if k >= ts_min_y and k <= ts_max_y or skip_date_limit:
commits_by_day_author_aggregate[author_key_cleaner(cs.author)] = {
"label":author_key_cleaner(cs.author),
"data":[{"time":k,
"commits":1,
"added":len(cs.added),
"changed":len(cs.changed),
"removed":len(cs.removed),
}],
"schema":["commits"],
Code refactoring,models renames...
r629 }
extended size of some input fields...
r562 #gather all data by day
renamed project to rhodecode
r547 if commits_by_day_aggregate.has_key(k):
commits_by_day_aggregate[k] += 1
else:
commits_by_day_aggregate[k] = 1
Code refactoring,models renames...
r629
code stats speed improvments
r804 overview_data = sorted(commits_by_day_aggregate.items(), key=itemgetter(0))
renamed project to rhodecode
r547 if not commits_by_day_author_aggregate:
commits_by_day_author_aggregate[author_key_cleaner(repo.contact)] = {
"label":author_key_cleaner(repo.contact),
"data":[0, 1],
"schema":["commits"],
}
stats = cur_stats if cur_stats else Statistics()
stats.commit_activity = json.dumps(commits_by_day_author_aggregate)
stats.commit_activity_combined = json.dumps(overview_data)
log.debug('last revison %s', last_rev)
leftovers = len(repo.revisions[last_rev:])
log.debug('revisions to parse %s', leftovers)
Code refactoring,models renames...
r629
if last_rev == 0 or leftovers < parse_limit:
added more logs into code stats
r854 log.debug('getting code trending stats')
renamed project to rhodecode
r547 stats.languages = json.dumps(__get_codes_stats(repo_name))
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 try:
moved statistics parse_limit into .ini files...
r1076 stats.repository = dbrepo
stats.stat_on_revision = last_cs.revision if last_cs else 0
renamed project to rhodecode
r547 sa.add(stats)
Code refactoring,models renames...
r629 sa.commit()
renamed project to rhodecode
r547 except:
log.error(traceback.format_exc())
sa.rollback()
return False
if len(repo.revisions) > 1:
run_task(get_commits_stats, repo_name, ts_min_y, ts_max_y)
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 return True
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 @task(ignore_result=True)
renamed project to rhodecode
r547 def reset_user_password(user_email):
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 try:
log = reset_user_password.get_logger()
except:
log = logging.getLogger(__name__)
renamed project to rhodecode
r547 from rhodecode.lib import auth
from rhodecode.model.db import User
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 try:
try:
sa = get_session()
user = sa.query(User).filter(User.email == user_email).scalar()
new_passwd = auth.PasswordGenerator().gen_password(8,
auth.PasswordGenerator.ALPHABETS_BIG_SMALL)
if user:
user.password = auth.get_crypt_password(new_passwd)
Added api_key into user, api key get's generated again after password change...
r1116 user.api_key = auth.generate_api_key(user.username)
renamed project to rhodecode
r547 sa.add(user)
sa.commit()
log.info('change password for %s', user_email)
if new_passwd is None:
raise Exception('unable to generate new password')
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 except:
log.error(traceback.format_exc())
sa.rollback()
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 run_task(send_email, user_email,
more renames for rhode code !!
r549 "Your new rhodecode password",
'Your new rhodecode password:%s' % (new_passwd))
renamed project to rhodecode
r547 log.info('send new password mail to %s', user_email)
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 except:
log.error('Failed to update user password')
log.error(traceback.format_exc())
Celery is configured by the .ini files and run from paster now...
r776
renamed project to rhodecode
r547 return True
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 @task(ignore_result=True)
renamed project to rhodecode
r547 def send_email(recipients, subject, body):
fixes #59, notifications for user registrations + some changes to mailer
r689 """
Sends an email with defined parameters from the .ini files.
source code cleanup: remove trailing white space, normalize file endings
r1203
fixes #59, notifications for user registrations + some changes to mailer
r689 :param recipients: list of recipients, it this is empty the defined email
address from field 'email_to' is used instead
:param subject: subject of the mail
:param body: body of the mail
"""
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 try:
log = send_email.get_logger()
except:
log = logging.getLogger(__name__)
Celery is configured by the .ini files and run from paster now...
r776 email_config = config
fixes #59, notifications for user registrations + some changes to mailer
r689
if not recipients:
recipients = [email_config.get('email_to')]
renamed project to rhodecode
r547 mail_from = email_config.get('app_email_from')
user = email_config.get('smtp_username')
passwd = email_config.get('smtp_password')
mail_server = email_config.get('smtp_server')
mail_port = email_config.get('smtp_port')
fixes #59, notifications for user registrations + some changes to mailer
r689 tls = str2bool(email_config.get('smtp_use_tls'))
ssl = str2bool(email_config.get('smtp_use_ssl'))
control mailer debug with the .ini file
r1169 debug = str2bool(config.get('debug'))
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 try:
m = SmtpMailer(mail_from, user, passwd, mail_server,
control mailer debug with the .ini file
r1169 mail_port, ssl, tls, debug=debug)
Code refactoring,models renames...
r629 m.send(recipients, subject, body)
renamed project to rhodecode
r547 except:
log.error('Mail sending failed')
log.error(traceback.format_exc())
return False
return True
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 @task(ignore_result=True)
renamed project to rhodecode
r547 def create_repo_fork(form_data, cur_user):
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002 try:
log = create_repo_fork.get_logger()
except:
log = logging.getLogger(__name__)
Code refactoring,models renames...
r629 from rhodecode.model.repo import RepoModel
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659 from vcs import get_backend
made rhodecode work with celery 2.2, made some tasks optimizations(forget results)...
r1002
fixed Example celery config to ampq,...
r752 repo_model = RepoModel(get_session())
some small fixes
r630 repo_model.create(form_data, cur_user, just_db=True, fork=True)
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659 repo_name = form_data['repo_name']
#50 on point cache invalidation changes....
r692 repos_path = get_repos_path()
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659 repo_path = os.path.join(repos_path, repo_name)
renamed project to rhodecode
r547 repo_fork_path = os.path.join(repos_path, form_data['fork_name'])
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659 alias = form_data['repo_type']
Code refactoring,models renames...
r629
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659 log.info('creating repo fork %s as %s', repo_name, repo_path)
backend = get_backend(alias)
backend(str(repo_fork_path), create=True, src_url=str(repo_path))
Code refactoring,models renames...
r629
renamed project to rhodecode
r547 def __get_codes_stats(repo_name):
Celery is configured by the .ini files and run from paster now...
r776 LANGUAGES_EXTENSIONS_MAP = {'scm': 'Scheme', 'asmx': 'VbNetAspx', 'Rout':
'RConsole', 'rest': 'Rst', 'abap': 'ABAP', 'go': 'Go', 'phtml': 'HtmlPhp',
'ns2': 'Newspeak', 'xml': 'EvoqueXml', 'sh-session': 'BashSession', 'ads':
'Ada', 'clj': 'Clojure', 'll': 'Llvm', 'ebuild': 'Bash', 'adb': 'Ada',
'ada': 'Ada', 'c++-objdump': 'CppObjdump', 'aspx':
'VbNetAspx', 'ksh': 'Bash', 'coffee': 'CoffeeScript', 'vert': 'GLShader',
'Makefile.*': 'Makefile', 'di': 'D', 'dpatch': 'DarcsPatch', 'rake':
'Ruby', 'moo': 'MOOCode', 'erl-sh': 'ErlangShell', 'geo': 'GLShader',
'pov': 'Povray', 'bas': 'VbNet', 'bat': 'Batch', 'd': 'D', 'lisp':
'CommonLisp', 'h': 'C', 'rbx': 'Ruby', 'tcl': 'Tcl', 'c++': 'Cpp', 'md':
'MiniD', '.vimrc': 'Vim', 'xsd': 'Xml', 'ml': 'Ocaml', 'el': 'CommonLisp',
'befunge': 'Befunge', 'xsl': 'Xslt', 'pyx': 'Cython', 'cfm':
'ColdfusionHtml', 'evoque': 'Evoque', 'cfg': 'Ini', 'htm': 'Html',
'Makefile': 'Makefile', 'cfc': 'ColdfusionHtml', 'tex': 'Tex', 'cs':
'CSharp', 'mxml': 'Mxml', 'patch': 'Diff', 'apache.conf': 'ApacheConf',
'scala': 'Scala', 'applescript': 'AppleScript', 'GNUmakefile': 'Makefile',
'c-objdump': 'CObjdump', 'lua': 'Lua', 'apache2.conf': 'ApacheConf', 'rb':
'Ruby', 'gemspec': 'Ruby', 'rl': 'RagelObjectiveC', 'vala': 'Vala', 'tmpl':
'Cheetah', 'bf': 'Brainfuck', 'plt': 'Gnuplot', 'G': 'AntlrRuby', 'xslt':
'Xslt', 'flxh': 'Felix', 'asax': 'VbNetAspx', 'Rakefile': 'Ruby', 'S': 'S',
'wsdl': 'Xml', 'js': 'Javascript', 'autodelegate': 'Myghty', 'properties':
'Ini', 'bash': 'Bash', 'c': 'C', 'g': 'AntlrRuby', 'r3': 'Rebol', 's':
'Gas', 'ashx': 'VbNetAspx', 'cxx': 'Cpp', 'boo': 'Boo', 'prolog': 'Prolog',
'sqlite3-console': 'SqliteConsole', 'cl': 'CommonLisp', 'cc': 'Cpp', 'pot':
'Gettext', 'vim': 'Vim', 'pxi': 'Cython', 'yaml': 'Yaml', 'SConstruct':
'Python', 'diff': 'Diff', 'txt': 'Text', 'cw': 'Redcode', 'pxd': 'Cython',
'plot': 'Gnuplot', 'java': 'Java', 'hrl': 'Erlang', 'py': 'Python',
'makefile': 'Makefile', 'squid.conf': 'SquidConf', 'asm': 'Nasm', 'toc':
'Tex', 'kid': 'Genshi', 'rhtml': 'Rhtml', 'po': 'Gettext', 'pl': 'Prolog',
'pm': 'Perl', 'hx': 'Haxe', 'ascx': 'VbNetAspx', 'ooc': 'Ooc', 'asy':
'Asymptote', 'hs': 'Haskell', 'SConscript': 'Python', 'pytb':
'PythonTraceback', 'myt': 'Myghty', 'hh': 'Cpp', 'R': 'S', 'aux': 'Tex',
'rst': 'Rst', 'cpp-objdump': 'CppObjdump', 'lgt': 'Logtalk', 'rss': 'Xml',
'flx': 'Felix', 'b': 'Brainfuck', 'f': 'Fortran', 'rbw': 'Ruby',
'.htaccess': 'ApacheConf', 'cxx-objdump': 'CppObjdump', 'j': 'ObjectiveJ',
'mll': 'Ocaml', 'yml': 'Yaml', 'mu': 'MuPAD', 'r': 'Rebol', 'ASM': 'Nasm',
'erl': 'Erlang', 'mly': 'Ocaml', 'mo': 'Modelica', 'def': 'Modula2', 'ini':
'Ini', 'control': 'DebianControl', 'vb': 'VbNet', 'vapi': 'Vala', 'pro':
'Prolog', 'spt': 'Cheetah', 'mli': 'Ocaml', 'as': 'ActionScript3', 'cmd':
'Batch', 'cpp': 'Cpp', 'io': 'Io', 'tac': 'Python', 'haml': 'Haml', 'rkt':
'Racket', 'st':'Smalltalk', 'inc': 'Povray', 'pas': 'Delphi', 'cmake':
'CMake', 'csh':'Tcsh', 'hpp': 'Cpp', 'feature': 'Gherkin', 'html': 'Html',
'php':'Php', 'php3':'Php', 'php4':'Php', 'php5':'Php', 'xhtml': 'Html',
'hxx': 'Cpp', 'eclass': 'Bash', 'css': 'Css',
'frag': 'GLShader', 'd-objdump': 'DObjdump', 'weechatlog': 'IrcLogs',
'tcsh': 'Tcsh', 'objdump': 'Objdump', 'pyw': 'Python', 'h++': 'Cpp',
'py3tb': 'Python3Traceback', 'jsp': 'Jsp', 'sql': 'Sql', 'mak': 'Makefile',
'php': 'Php', 'mao': 'Mako', 'man': 'Groff', 'dylan': 'Dylan', 'sass':
'Sass', 'cfml': 'ColdfusionHtml', 'darcspatch': 'DarcsPatch', 'tpl':
'Smarty', 'm': 'ObjectiveC', 'f90': 'Fortran', 'mod': 'Modula2', 'sh':
'Bash', 'lhs': 'LiterateHaskell', 'sources.list': 'SourcesList', 'axd':
'VbNetAspx', 'sc': 'Python'}
some small fixes
r630
#50 on point cache invalidation changes....
r692 repos_path = get_repos_path()
Hacking for git support,and new faster repo scan
r631 p = os.path.join(repos_path, repo_name)
Fixed age, for new vcs implementation. Removed all obsolete date formatters...
r635 repo = get_repo(p)
removed soon deprecated walk method on repository instance
r603 tip = repo.get_changeset()
renamed project to rhodecode
r547 code_stats = {}
some small fixes
r630
def aggregate(cs):
for f in cs[2]:
Celery is configured by the .ini files and run from paster now...
r776 ext = f.extension
key = LANGUAGES_EXTENSIONS_MAP.get(ext, ext)
key = key or ext
removed binary files from trending sources
r789 if ext in LANGUAGES_EXTENSIONS_MAP.keys() and not f.is_binary:
Celery is configured by the .ini files and run from paster now...
r776 if code_stats.has_key(key):
code_stats[key] += 1
renamed project to rhodecode
r547 else:
Celery is configured by the .ini files and run from paster now...
r776 code_stats[key] = 1
Code refactoring,models renames...
r629
some small fixes
r630 map(aggregate, tip.walk('/'))
renamed project to rhodecode
r547 return code_stats or {}