diff --git a/development.ini b/development.ini --- a/development.ini +++ b/development.ini @@ -32,7 +32,7 @@ threadpool_workers = 5 threadpool_max_requests = 6 ##option to use threads of process -use_threadpool = false +use_threadpool = true use = egg:Paste#http host = 0.0.0.0 @@ -45,6 +45,7 @@ static_files = true lang=en cache_dir = %(here)s/data index_dir = %(here)s/data/index +app_instance_uuid = develop cut_off_limit = 256000 force_https = false @@ -70,7 +71,7 @@ celery.result.serialier = json celeryd.concurrency = 2 #celeryd.log.file = celeryd.log celeryd.log.level = debug -celeryd.max.tasks.per.child = 3 +celeryd.max.tasks.per.child = 1 #tasks will never be sent to the queue, but executed locally instead. celery.always.eager = false @@ -78,8 +79,9 @@ celery.always.eager = false #################################### ### BEAKER CACHE #### #################################### -beaker.cache.data_dir=/%(here)s/data/cache/data -beaker.cache.lock_dir=/%(here)s/data/cache/lock +beaker.cache.data_dir=%(here)s/data/cache/data +beaker.cache.lock_dir=%(here)s/data/cache/lock + beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long beaker.cache.super_short_term.type=memory @@ -138,21 +140,21 @@ logview.pylons.util = #eee ### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG ### ######################################################### sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db -#sqlalchemy.db1.echo = False -#sqlalchemy.db1.pool_recycle = 3600 +sqlalchemy.db1.echo = True +sqlalchemy.db1.pool_recycle = 3600 sqlalchemy.convert_unicode = true ################################ ### LOGGING CONFIGURATION #### ################################ [loggers] -keys = root, routes, rhodecode, sqlalchemy,beaker,templates +keys = root, routes, rhodecode, sqlalchemy, beaker, templates [handlers] -keys = console +keys = console, console_sql [formatters] -keys = generic,color_formatter +keys = generic, color_formatter, color_formatter_sql ############# ## LOGGERS ## @@ -163,32 +165,32 @@ handlers = console [logger_routes] level = DEBUG -handlers = console +handlers = qualname = routes.middleware # "level = DEBUG" logs the route matched and routing variables. -propagate = 0 +propagate = 1 [logger_beaker] -level = ERROR -handlers = console +level = DEBUG +handlers = qualname = beaker.container -propagate = 0 +propagate = 1 [logger_templates] level = INFO -handlers = console +handlers = qualname = pylons.templating -propagate = 0 +propagate = 1 [logger_rhodecode] level = DEBUG -handlers = console +handlers = qualname = rhodecode -propagate = 0 +propagate = 1 [logger_sqlalchemy] -level = ERROR -handlers = console +level = INFO +handlers = console_sql qualname = sqlalchemy.engine propagate = 0 @@ -202,6 +204,12 @@ args = (sys.stderr,) level = NOTSET formatter = color_formatter +[handler_console_sql] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = color_formatter_sql + ################ ## FORMATTERS ## ################ @@ -213,4 +221,9 @@ datefmt = %Y-%m-%d %H:%M:%S [formatter_color_formatter] class=rhodecode.lib.colored_formatter.ColorFormatter format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %Y-%m-%d %H:%M:%S + +[formatter_color_formatter_sql] +class=rhodecode.lib.colored_formatter.ColorFormatterSql +format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s datefmt = %Y-%m-%d %H:%M:%S \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst --- a/docs/index.rst +++ b/docs/index.rst @@ -53,5 +53,4 @@ Other topics .. _git: http://git-scm.com/ .. _celery: http://celeryproject.org/ .. _Sphinx: http://sphinx.pocoo.org/ -.. _GPL: http://www.gnu.org/licenses/gpl.html -.. _vcs: http://pypi.python.org/pypi/vcs +.. _vcs: http://pypi.python.org/pypi/vcs \ No newline at end of file diff --git a/docs/setup.rst b/docs/setup.rst --- a/docs/setup.rst +++ b/docs/setup.rst @@ -10,7 +10,7 @@ Setting up RhodeCode First, you will need to create a RhodeCode configuration file. Run the following command to do this:: - paster make-config RhodeCode production.ini + paster make-config RhodeCode production.ini - This will create the file `production.ini` in the current directory. This configuration file contains the various settings for RhodeCode, e.g proxy port, @@ -23,7 +23,7 @@ default ensure you properly adjust the d configuration file to use this other database. Create the databases by running the following command:: - paster setup-app production.ini + paster setup-app production.ini This will prompt you for a "root" path. This "root" path is the location where RhodeCode will store all of its repositories on the current machine. After @@ -43,7 +43,7 @@ for the initial admin account which ``se You are now ready to use RhodeCode, to run it simply execute:: - paster serve production.ini + paster serve production.ini - This command runs the RhodeCode server. The web app should be available at the 127.0.0.1:5000. This ip and port is configurable via the production.ini @@ -60,7 +60,7 @@ repositories. Then choose Add New Reposi the root. Test that you can browse your repository from within RhodeCode and then try cloning your repository from RhodeCode with:: - hg clone http://127.0.0.1:5000/ + hg clone http://127.0.0.1:5000/ where *repository name* is replaced by the name of your repository. @@ -307,12 +307,11 @@ http://wiki.pylonshq.com/display/pylonsc Apache as subdirectory ---------------------- - Apache subdirectory part:: - - ProxyPass http://127.0.0.1:59542/rhodecode - ProxyPassReverse http://127.0.0.1:59542/rhodecode + > + ProxyPass http://127.0.0.1:5000/ + ProxyPassReverse http://127.0.0.1:5000/ SetEnvIf X-Url-Scheme https HTTPS=1 @@ -327,6 +326,8 @@ Add the following at the end of the .ini prefix = / +then change into your choosen prefix + Apache's example FCGI config ---------------------------- diff --git a/ez_setup.py b/ez_setup.py --- a/ez_setup.py +++ b/ez_setup.py @@ -15,7 +15,8 @@ This file can also be run as a script to """ import sys DEFAULT_VERSION = "0.6c9" -DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] +DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" \ + % sys.version[:3] md5_data = { 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', @@ -54,25 +55,27 @@ md5_data = { 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', } -import sys, os -try: from hashlib import md5 -except ImportError: from md5 import md5 +import os + +try: + from hashlib import md5 +except ImportError: + from md5 import md5 + def _validate_md5(egg_name, data): if egg_name in md5_data: digest = md5(data).hexdigest() if digest != md5_data[egg_name]: - print >>sys.stderr, ( + print >> sys.stderr, ( "md5 validation of %s failed! (Possible download problem?)" - % egg_name - ) + % egg_name) sys.exit(2) return data -def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - download_delay=15 -): + +def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, download_delay=15): """Automatically find/download setuptools and make it available on sys.path `version` should be a valid setuptools version number that is available @@ -84,25 +87,29 @@ def use_setuptools( this routine will print a message to ``sys.stderr`` and raise SystemExit in an attempt to abort the calling script. """ - was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules + was_imported = 'pkg_resources' in sys.modules or ('setuptools' in + sys.modules) + def do_download(): - egg = download_setuptools(version, download_base, to_dir, download_delay) + egg = download_setuptools(version, download_base, to_dir, + download_delay) sys.path.insert(0, egg) - import setuptools; setuptools.bootstrap_install_from = egg + import setuptools + setuptools.bootstrap_install_from = egg try: import pkg_resources except ImportError: - return do_download() + return do_download() try: - pkg_resources.require("setuptools>="+version); return + pkg_resources.require("setuptools>=" + version) + return except pkg_resources.VersionConflict, e: if was_imported: - print >>sys.stderr, ( + print >> sys.stderr, ( "The required version of setuptools (>=%s) is not available, and\n" "can't be installed while this script is running. Please install\n" " a more recent version first, using 'easy_install -U setuptools'." - "\n\n(Currently using %r)" - ) % (version, e.args[0]) + "\n\n(Currently using %r)") % (version, e.args[0]) sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload ok @@ -110,19 +117,20 @@ def use_setuptools( except pkg_resources.DistributionNotFound: return do_download() -def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - delay = 15 -): + +def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, delay=15): """Download setuptools from a specified location and return its filename `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download attempt. + `delay` is the number of seconds to pause before an actual download + attempt. """ - import urllib2, shutil - egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) + import urllib2 + + egg_name = "setuptools-%s-py%s.egg" % (version, sys.version[:3]) url = download_base + egg_name saveto = os.path.join(to_dir, egg_name) src = dst = None @@ -144,54 +152,24 @@ I will start the download in %d seconds. and place it in this directory before rerunning this script.) ---------------------------------------------------------------------------""", - version, download_base, delay, url - ); from time import sleep; sleep(delay) + version, download_base, delay, url) + from time import sleep + sleep(delay) log.warn("Downloading %s", url) src = urllib2.urlopen(url) # Read/write all in one block, so we don't create a corrupt file # if the download is interrupted. data = _validate_md5(egg_name, src.read()) - dst = open(saveto,"wb"); dst.write(data) + dst = open(saveto, "wb") + dst.write(data) finally: - if src: src.close() - if dst: dst.close() + if src: + src.close() + if dst: + dst.close() return os.path.realpath(saveto) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def main(argv, version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" try: @@ -200,21 +178,21 @@ def main(argv, version=DEFAULT_VERSION): egg = None try: egg = download_setuptools(version, delay=0) - sys.path.insert(0,egg) + sys.path.insert(0, egg) from setuptools.command.easy_install import main - return main(list(argv)+[egg]) # we're done here + return main(list(argv) + [egg]) # we're done here finally: if egg and os.path.exists(egg): os.unlink(egg) else: if setuptools.__version__ == '0.0.1': - print >>sys.stderr, ( + print >> sys.stderr, ( "You have an obsolete version of setuptools installed. Please\n" - "remove it from your system entirely before rerunning this script." - ) + "remove it from your system entirely before rerunning" + " this script.") sys.exit(2) - req = "setuptools>="+version + req = "setuptools>=" + version import pkg_resources try: pkg_resources.require(req) @@ -223,16 +201,18 @@ def main(argv, version=DEFAULT_VERSION): from setuptools.command.easy_install import main except ImportError: from easy_install import main - main(list(argv)+[download_setuptools(delay=0)]) - sys.exit(0) # try to force an exit + main(list(argv) + [download_setuptools(delay=0)]) + sys.exit(0) # try to force an exit else: if argv: from setuptools.command.easy_install import main main(argv) else: - print "Setuptools version",version,"or greater has been installed." + print "Setuptools version", version, ("or greater has " + "been installed.") print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' + def update_md5(filenames): """Update our built-in md5 registry""" @@ -240,7 +220,7 @@ def update_md5(filenames): for name in filenames: base = os.path.basename(name) - f = open(name,'rb') + f = open(name, 'rb') md5_data[base] = md5(f.read()).hexdigest() f.close() @@ -250,27 +230,23 @@ def update_md5(filenames): import inspect srcfile = inspect.getsourcefile(sys.modules[__name__]) - f = open(srcfile, 'rb'); src = f.read(); f.close() + f = open(srcfile, 'rb') + src = f.read() + f.close() match = re.search("\nmd5_data = {\n([^}]+)}", src) if not match: - print >>sys.stderr, "Internal error!" + print >> sys.stderr, "Internal error!" sys.exit(2) src = src[:match.start(1)] + repl + src[match.end(1):] - f = open(srcfile,'w') + f = open(srcfile, 'w') f.write(src) f.close() -if __name__=='__main__': - if len(sys.argv)>2 and sys.argv[1]=='--md5update': +if __name__ == '__main__': + if len(sys.argv) > 2 and sys.argv[1] == '--md5update': update_md5(sys.argv[2:]) else: main(sys.argv[1:]) - - - - - - diff --git a/production.ini b/production.ini --- a/production.ini +++ b/production.ini @@ -1,6 +1,6 @@ ################################################################################ ################################################################################ -# rhodecode - Pylons environment configuration # +# RhodeCode - Pylons environment configuration # # # # The %(here)s variable will be replaced with the parent directory of this file# ################################################################################ @@ -10,7 +10,7 @@ debug = true ################################################################################ ## Uncomment and replace with the address which should receive ## ## any error reports after application crash ## -## Additionally those settings will be used by rhodecode mailing system ## +## Additionally those settings will be used by RhodeCode mailing system ## ################################################################################ #email_to = admin@localhost #error_email_from = paste_error@localhost @@ -78,8 +78,9 @@ celery.always.eager = false #################################### ### BEAKER CACHE #### #################################### -beaker.cache.data_dir=/%(here)s/data/cache/data -beaker.cache.lock_dir=/%(here)s/data/cache/lock +beaker.cache.data_dir=%(here)s/data/cache/data +beaker.cache.lock_dir=%(here)s/data/cache/lock + beaker.cache.regions=super_short_term,short_term,long_term,sql_cache_short,sql_cache_med,sql_cache_long beaker.cache.super_short_term.type=memory @@ -147,37 +148,49 @@ sqlalchemy.convert_unicode = true ### LOGGING CONFIGURATION #### ################################ [loggers] -keys = root, routes, rhodecode, sqlalchemy +keys = root, routes, rhodecode, sqlalchemy, beaker, templates [handlers] -keys = console +keys = console, console_sql [formatters] -keys = generic,color_formatter +keys = generic, color_formatter, color_formatter_sql ############# ## LOGGERS ## ############# [logger_root] -level = INFO +level = NOTSET handlers = console [logger_routes] -level = INFO -handlers = console +level = DEBUG +handlers = qualname = routes.middleware # "level = DEBUG" logs the route matched and routing variables. -propagate = 0 +propagate = 1 + +[logger_beaker] +level = DEBUG +handlers = +qualname = beaker.container +propagate = 1 + +[logger_templates] +level = INFO +handlers = +qualname = pylons.templating +propagate = 1 [logger_rhodecode] level = DEBUG -handlers = console +handlers = qualname = rhodecode -propagate = 0 +propagate = 1 [logger_sqlalchemy] -level = ERROR -handlers = console +level = INFO +handlers = console_sql qualname = sqlalchemy.engine propagate = 0 @@ -188,9 +201,15 @@ propagate = 0 [handler_console] class = StreamHandler args = (sys.stderr,) -level = NOTSET +level = INFO formatter = color_formatter +[handler_console_sql] +class = StreamHandler +args = (sys.stderr,) +level = WARN +formatter = color_formatter_sql + ################ ## FORMATTERS ## ################ @@ -202,4 +221,9 @@ datefmt = %Y-%m-%d %H:%M:%S [formatter_color_formatter] class=rhodecode.lib.colored_formatter.ColorFormatter format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %Y-%m-%d %H:%M:%S + +[formatter_color_formatter_sql] +class=rhodecode.lib.colored_formatter.ColorFormatterSql +format= %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s datefmt = %Y-%m-%d %H:%M:%S \ No newline at end of file diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -2,6 +2,7 @@ import sys from rhodecode import get_version from rhodecode import __platform__ from rhodecode import __license__ +from rhodecode import PLATFORM_OTHERS py_version = sys.version_info @@ -36,7 +37,7 @@ if py_version < (2, 6): requirements.append("simplejson") requirements.append("pysqlite") -if __platform__ in ('Linux', 'Darwin'): +if __platform__ in PLATFORM_OTHERS: requirements.append("py-bcrypt")